您的位置:首页 > 其它

快排思想求给定序列中第k大的数

2016-08-11 14:43 393 查看
思想:快排的思想就是每排一次,就会把一个数(也就是我们选定的那个key)放到它在这个序列中正确的位置,所以每排一次就返回这个数所在下标看它是不是我们所要找的那个数(对应下面代码的ret是否等于size-k)

#include <iostream>
#include <vector>

int QuockSort(int* array, int size, int k,std::vector<int>& vtmparr)
{
int first = 0;
int last = size - 1;
int key = 0;
int i = 0;
for (; i < vtmparr.size(); ++i){
if (key == vtmparr[i]){
++key;
i = 0;
}
}
first = key;
int tmp = array[key];
while (first <= last){
while (first <= last && array[last] >= tmp){
--last;
}
if (first <= last){
std::swap(array[key], array[last]);
key = last;
}
while (first <= last && array[first] <= tmp){
++first;
}
if (first <= last){
std::swap(array[key], array[first]);
key = first;
}
}
return key;
}

int NumOfKMax(int* array,int size,int k,std::vector<int>& vtmparr)
{
static int i = 0;
int ret = -1;
while (ret != size - k){
ret = QuockSort(array, size, k,vtmparr);//ret为下标为ret的数据到达正确的位置
vtmparr.push_back(ret);
}
return array[ret];
}

int main()
{
int array[7] = {4,8,2,3,6,7,0};
std::vector<int> vtmparr;
int k = 7;
int num = NumOfKMax(array,sizeof(array)/sizeof(array[0]), k,vtmparr);
std::cout << num << std::endl;

system("pause");
return 0;
}


《完》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  思想 快排 给定