問題是這樣的,有一組數據,請找出這組數據中的第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);
}
代碼運行效果如下所示: