在数组a的前n个元素中找出第k(1≤k≤n)小的元素,例如,数组{98, 33, 21, 102, 45, 5, 32, 11, 65, 82, 193, 321, 34, 72}中第5小的元素是33。
【分析】
这是上海大学考研试题。要查找第k小的元素,并不需要完全对数组中的元素进行排序,可以利用快速排序算法思想,只对部分元素进行排序就可以找到第k小元素。
一趟排序结束后,若i==k,说明找到了第k小元素,算法结束。否则,如果i<k,则说明第k小元素在i=1----high之间;如果i>k,则表明第k小元素在low----i-1之间。最后返回最小元素a[k]。
main.cpp
#include <iostream>
#include <iomanip>
using namespace std;
#define MAX 100
int Search_K_Min(int a[],int n,int k);
void PrintArray(int a[],int n);
void main()
{
int a[] = { 98, 33, 21, 102, 45, 5, 32, 11, 65, 82, 193, 321, 34, 72 };
int n, k, x;
n = sizeof(a) / sizeof(a[0]);
cout << "请输入要查找第几小的元素值:" << endl;
cin >> k;
x = Search_K_Min(a, n, k);
cout << "数组中的元素:"<<endl;
PrintArray(a, n);
cout << "第" << k << "小的元素值是:";
cout << x << endl;
system("pause");
}
int Search_K_Min(int a[], int n, int k)
{
int low, high, i, j, t;
k--;
low = 0;
high = n - 1;
do
{
i = low;
j = high;
t = a[low];
do
{
while (i<j&&t<a[j])
{
j--;
}
if (i<j)
{
a[i++] = a[j];
}
while (i<j&&t>=a[i])
{
i++;
}
if (i<j)
{
a[j--] = a[i];
}
} while (i<j);
a[i] = t;
if (i==k)
{
break;
}
if (i<k)
{
low = i + 1;
}
else
{
high = i - 1;
}
} while (i!=k);
return a[k];
}
void PrintArray(int a[], int n)
{
int i;
for (i = 0; i < n;i++)
{
cout << setw(4) << a[i];
}
cout << endl;
}
结果: