求数组中第k大的数(分治法)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求数组中第k大的数(分治法)相关的知识,希望对你有一定的参考价值。
思想:快排
因为单趟排序是使选定的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; }
《完》
本文出自 “零蛋蛋” 博客,谢绝转载!
以上是关于求数组中第k大的数(分治法)的主要内容,如果未能解决你的问题,请参考以下文章
找出数组中第k大的数(时间复杂度分析C++代码实现). TopK in array. ( leetcode - 215 )