数组2——查找第k小元素

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36669549/article/details/84899109

在数组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;
}

结果:

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/84899109
今日推荐