線性時間選擇(分治):找出一組數中的第k小元素||C++

問題是這樣的,有一組數據,請找出這組數據中的第k小的元素。

這個問題爲什麼叫線性時間選擇,我至今沒有弄清楚,忘大家能給解釋以下。

我在這裏給出上述問題的代碼:

這裏利用的是快排的分割算法。是採用分治法的思想,即將問題劃分規模更小的子問題。

代碼如下:

#include<iostream>
using namespace std;
int quick(int* arr, int start, int end)
{
	int low = start;
	int high = end;
	int temp = arr[low];
	while (low < high)
	{
		while (low < high && temp < arr[high])
		{
			--high;
		}
		if (low == high)
		{
			break;
		}
		else
		{
			arr[low] = arr[high];
			++low;
		}
		while (low<high && temp>arr[low])
		{
			++low;
		}
		if (low == high)
		{
			break;
		}
		else
		{
			arr[high] = arr[low];
			--high;
		}
	}
	arr[high] = temp;
	return low;
}
int GetK(int* arr, int len, int k)
{
	
	int begin = 0, end = len - 1;
	int res = 0; 
	while (begin<=end)
	{
		res = quick(arr, begin, end); 
		if (res == k-1)
			return arr[res];
		if (res < k-1)
		{
			begin = res + 1;
		}
		else
			end = res - 1;
	}
}
int main()
{
	int arr[] = { 1,2,78,342,543543,123,78,4,54 };
	int k = 3;
	cout << "第" << k << "小的數爲" << GetK(arr, sizeof(arr) / sizeof(arr[0]), k);
	
}

代碼運行效果如下所示:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章