1. 程式人生 > >陣列2——查詢第k小元素

陣列2——查詢第k小元素

在陣列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;
}

結果: