演算法實踐系列 查詢第K大值

2021-08-26 04:48:05 字數 1206 閱讀 3583

下面的演算法實現基於隨機化快排,有乙個前提是需要假設所有的元素都不相等,否則演算法不成立。下面是具體實現:

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迴圈裡面...