演算法:利用分治演算法求解N個元素中的第M大元素
題目描述:
設計一個分治演算法,在一個具有n個元素的陣列中,尋找第5大元素,並分析演算法的時間複雜性。
演算法描述:
基本的思路是利用劃分的思想減小問題的規模,但是按照一般的快速排序的演算法的思想,作為分界線的元素從第一個元素開始一直到最後一個元素,當遇到特殊情況時,每次只能分離一個元素,大大減少了演算法的效率,為了杜絕這種情況的出現,所以我們在演算法內引入規定範圍內的隨機數,以它作為獲取分界元素的依據,使得整個演算法的效率更加平穩,不會隨著資料樣本產生大幅度波動變化。
當減少的問題規模為1的時候,當前所剩下的唯一元素即為該問題的解。
程式碼:
package demo;
import java.util.Scanner;
public class MyCount {
//尋找第五大元素
public static int Search(int []array,int L,int R,int count) {
//L是左邊界,R是右邊界,count是將要查詢第幾大元素
if(L==R)//左右相等,排序完成,即也找到
return array[L];
int i = RParttition(array, L, R);
int j = i-L+1;
if(count<=j)
return Search(array, L, i, count);
else
return Search(array, i+1, R, count-j);
}
//隨機劃分
public static int RParttition(int array[],int L,int R) {
int i = L+(int)(Math.random()*((R-L)+0));//獲得一個範圍內的隨機數
array[L] = (array[L]+array[i])-(array[i]=array[L]);
return Partition(array,L,R);
}
//進行快速排序
public static int Partition(int array[],int L,int R) {
int i = L;
int j = R+1;
int x = array[L];
while(true) {
while(array[++i]<x&&i<R);
while(array[--j]>x);
if(i>=j)
break;
array[i] = array[i]+array[j] - (array[j]=array[i]);
}
array[L] = array[j];
array[j] = x;
return j;
}
public static void main(String[] args) {
int n;
System.out.println("請輸入你想輸入元素的個數:");
Scanner sc = new Scanner(System.in);
int input1 = sc.nextInt();
n = input1;
System.out.println("請輸入"+n+"個數字:");
int a[] = new int[n];
for(int i=0;i<n;i++) {
int input2 = sc.nextInt();
a[i] = input2;
}
//呼叫函式
System.out.println("第五個元素為:"+Search(a,0,n-1,5));
}
}
相關文章
- JavaScript 獲取第n個li元素JavaScript
- jQuery查詢第n個li元素jQuery
- CSS 第N個子元素樣式CSS
- 獲取陣列第N個元素的方法陣列
- CSS設定第n個li元素樣式CSS
- CSS 設定第n個li元素樣式CSS
- CSS 倒數第n個li元素樣式CSS
- 主元素演算法演算法
- 利用非遞迴演算法來搜尋二叉樹中的某個元素java遞迴演算法二叉樹Java
- css 獲取從第n個開始,之後的所有元素CSS
- 分治演算法-求解棋盤覆蓋問題演算法
- 尋找陣列中第K大的元素陣列
- 查詢陣列中第K大的元素陣列
- CSS 設定從第n個開始li元素樣式CSS
- 陣列中的第K個最大元素陣列
- Python實用技法第2篇:使用deque保留最新的N個元素Python
- 洗牌演算法擴充(從n個數中隨機m個數)演算法隨機
- 215. 陣列中的第K個最大元素陣列
- 獲取一個陣列裡面第K大的元素陣列
- 演算法169. 多數元素演算法
- 215、陣列中的第K個最大元素 | 演算法(leetcode,附思維導圖 + 全部解法)300題陣列演算法LeetCode
- LeetCode-215-陣列中的第K個最大元素LeetCode陣列
- 分治演算法演算法
- TopK問題,陣列中第K大(小)個元素問題總結TopK陣列
- 演算法--力扣27. 移除元素演算法力扣
- CSS 第2個li元素樣式CSS
- CSS 設定前n個li元素樣式CSS
- 第k大元素
- 力扣-215. 陣列中的第K個最大元素力扣陣列
- 網頁元素居中的n種方法網頁
- 961. 重複 N 次的元素
- 如何利用Python隨機從list中挑選一個元素Python隨機
- 調整陣列元素順序演算法陣列演算法
- 五大常用演算法:一文搞懂分治演算法演算法
- 【五大常用演算法】一文搞懂分治演算法演算法
- 統計陣列元素中每個元素出現的次數陣列
- 利用遺傳學演算法求解工作分配問題演算法
- 演算法設計與分析中的幾個核心演算法策略:動態規劃、貪心演算法、回溯演算法和分治演算法演算法動態規劃