首页 > 代码库 > 求数组中第k大的数(分治法)

求数组中第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大的数(分治法)