快排以及基于快排思想的topk 一鍋端demo
標(biāo)簽:
數(shù)據(jù)結(jié)構(gòu)
算法不好,补补基本的排序算法,弄懂了快排,发现topK问题中也能用快排的思想所以写了一个demo
填坑解释法解释快排很形象,我是看这篇看懂快排的,这里推荐一下
http://blog.csdn.net/chengqiaoyahaixuyush/article/details/38273893
以下是快排和基于快排思想的topK问题的实践demo
public class TopK_Quick {
public static void main(String args[]) {
int k = 3;
int a[] = {2, 0, 5, 4, 3, 1};
if (k > 0 && k <= a.length - 1) {
selectK(a, 0, a.length - 1, k);
display(a, k);
//因为执行完selectK 拿到的top K是无序的,这里对top K 个元素再排序
int[] b = new int[k];
System.arraycopy(a, 0, b, 0, k);
QuickSort(b, 0, b.length - 1);
display(b, k);
} else {
System.out.println("Are You Kidding Me?");
}
}
public static int PartitionLow(int a[], int low, int high) {
int pivokey = a[low];
while (low < high) {
while (low < high && a[high] >= pivokey) --high;
a[low] = a[high];
while (low < high && a[low] <= pivokey) ++low;
a[high] = a[low];
}
a[low] = pivokey;
return low;
}
public static int PartitionHigh(int a[], int low, int high) {
int pivokey = a[low];
while (low < high) {
while (low < high && a[high] <= pivokey) --high;
a[low] = a[high];
while (low < high && a[low] > pivokey) ++low;
a[high] = a[low];
}
a[low] = pivokey;
return low;
}
public static void QuickSort(int a[], int low, int high) {
if (low >= high || a.length <= 1) {
return;
}
int i = low;
int j = high;
int x = a[i];
while (i < j) {
while (i < j && a[j] >= x) j--;
if (i < j) {
a[i++] = a[j];
}
while (i < j && a[i] < x) i++;
if (i < j) {
a[j--] = a[i];
}
}
a[i] = x;
QuickSort(a, low, i - 1);
QuickSort(a, i + 1, high);
}
public static void display(int[] a, int k) {
for (int i = 0; i < k; i++) {
System.out.print(a[i] + " ");
}
System.out.println("");
}
public static int selectK(int a[], int start, int end, int k) {
int index = 0;
if (start < end) {
//获取最大K个数
index = PartitionHigh(a, start, end);
//获取最小K个数
// index = PartitionLow(a, start, end);
if (index == k)//正好找到第k大的数
{
index = k;
} else if (index < k)//还要从index的右边找k-index个数
{
index = selectK(a, index + 1, end, k - index);
} else if (index > k)//k个数都在Index的左边
{
index = selectK(a, start, index - 1, k);
}
}
return index;
}
}
點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦