码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-11 16:03:56      阅读:188      评论:0      收藏:0      [点我收藏+]

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

思想:快排的思想就是每排一次,就会把一个数(也就是我们选定的那个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;
}



《完》

本文出自 “零蛋蛋” 博客,谢绝转载!

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

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

原文地址:http://lingdandan.blog.51cto.com/10697032/1836881

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!