求数组中第k大的数(分治法)
程序员文章站
2022-05-12 10:58:08
...
思想:快排
因为单趟排序是使选定的king值到其应该到的位置,所以每次判断这个king的正确位置是否是第K大数的位置即可
#include <iostream>
using namespace std;
//快排中的单趟排序
int PartSort(int* arr,int start,int end)
{
int first = start;
int last = end;
int tmp = arr[first];
int key = first;
while (first < last){
while (first<last && arr[last]>=tmp){
--last;
}
if (first < last){
arr[first] = arr[last];
key = last;
}
while (first < last&& arr[first] <= tmp){
++first;
}
if (first < last){
arr[last] = arr[first];
key = first;
}
arr[first] = tmp;
}
return key;
}
//循环判断是否找到了第K大数对应的下标位置
int quickly(int* arr,int start,int end,int k,int size)
{
int ret=PartSort(arr, start, end);
while (ret != size-k){
if (ret > size-k){
end = ret - 1;
ret = PartSort(arr, start,end);
}
else{
start = ret + 1;
ret = PartSort(arr,ret+1,end);
}
}
return arr[ret];
}
int kNumOfArr(int* arr,int size,int k)
{
//判断参数有效性
if (arr == NULL || size <= 0 || k <= 0 || k > size)
return -1;
return quickly(arr, 0, size - 1, k, size);
}
int main()
{
int arr[] = { 5, 8, 100, 6, 7, 1, 6, 0 };
for (int k = 1; k <= 8; ++k){
int ret = kNumOfArr(arr, sizeof(arr) / sizeof(arr[0]), k);
cout << ret << endl;
}
system("pause");
return 0;
}
《完》
转载于:https://blog.51cto.com/lingdandan/1853366
上一篇: LeetCode--键盘行
下一篇: 重构HashTable