码迷,mamicode.com
首页 > 编程语言 > 详细

求数组中第k大的数(分治法)

时间:2016-09-17 22:14:10      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:求数组中第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大的数

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

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