下面的演算法實現基於隨機化快排,有乙個前提是需要假設所有的元素都不相等,否則演算法不成立。下面是具體實現:
1)隨機劃分演算法與快排一樣:
///
/// 快速排序的分隔,即:對於乙個指定的主元x,找到位置i,使得i的左邊元素都小於等於x,右邊都大於等於x.
///
///
///
///
///
private int quicksortpartion(int a, int p, int q)
//如果元素為2,則不用繼續分割,只需要簡單處理即可,這可以節省一些時間,但不是必須.
if (thecount == 2)
return -1;
}//隨機獲取主元
random ther=new random(10);
int themasterindex = ther.next(1, thecount);
int themasterp = p + themasterindex -1;
//找到主元x,並與下界元素交換。
int thex = a[themasterp];
a[themasterp] = a[p];
a[p] = thex;
int i = p;
//尋找i,使得小於i位置的元素都小於等於thex,大於i位置的元素都大於thex.
for(int j=p+1;j<=q;j++)
count2++;
}//將主元放到位置i.
a[p] = a[i];
a[i] = thex;
return i;
}2)查詢演算法,與快排類似:
///
/// 尋找序列中第k大的值.
///
/// 序列
/// 序列開始位置
/// 序列結束位置
/// 查詢結果條件
private int findnokvalue(int a, int s, int e,int k)
//查詢跟快排的區別就是每次只需要進入乙個分支。
//如果劃分位置剛好是k,就表示第k大值找到.
if (thedivi == k)
//如果查詢劃分位置大於k,則進入小的劃分,否則進入大的劃分.
if (thedivi > k)
}else
}return -1;
}
演算法實踐系列 查詢第K大值
下面的演算法實現基於隨機化快排,有乙個前提是需要假設所有的元素都不相等,否則演算法不成立。下面是具體實現 1 隨機劃分演算法與快排一樣 快速排序的分隔,即 對於乙個指定的主元x,找到位置i,使得i的左邊元素都小於等於x,右邊都大於等於x.private int quicksortpartion in...
查詢第K大的值
這種題一般是給定n個數,然後n個數之間通過某種計算得到了新的數列,求這新的數列的第k大的值 poj3579 題意 用 n 個數的序列 x i 生成乙個新序列 b 新的序列定義為 對於任意的 i j 且 i j 有 b abs x i x j 問新序列的中位數是什麼,如果新序列的長度為偶數那麼我們定義...
作業 查詢第k大的元素
由於是要找 k 個最大的數,所以沒有必要對所有數進行完整的排序。每次只保留 k 個當前最大的數就可以,然後每次對新來的元素跟當前 k 個樹中最小的數比較,新元素大的話則插入到陣列中,否則跳過。迴圈結束後陣列中最小的數即是我們要找到第 k 大的數。時間複雜度 n k logk 注意 巢狀for迴圈裡面...