数组第k大的元素的位置

/*快速排序(分治法)原理:是对冒泡排序的一种改进,基本思想是通过一趟排序以待排第一个数据(或最后一个数据)为支点,将待排数据分割成独立的两部分,
其中一部分数据均比另一部分数据小,则可分别对这两部分数据继续进行排序,以达到整个序列有序。
时间复杂度:平均:O(nlogn),最坏:O(n^2),空间复杂度:O(logn)*/
#include <iostream>
using namespace std;
int partition(int*L, int low, int high)
{
	int temp = L[low];//以第一个数据为支点

	while (low < high)//完成一趟排序
	{
		while (low<high&&L[high] >= temp)
			--high;

		L[low] = L[high];//比支点小的移到低端

		while (low < high && L[low] <= temp)
			++low;

		L[high] = L[low];//比支点大的移到高端

	}//终止循环之后low和high一定相等

	 //int temp=L[high];//以最后一个数据为支点
	 //while (low < high)//完成一趟排序
	 //{
	 //	while(low<high&&L[low]<=temp)//从左往右移动,比支点小就不交换
	 //		++low;
	 //	L[high]=L[low];
	 //	while(low<high&&L[high]>=temp)
	 //		--high;
	 //	L[low]=L[high];
	 //}


	L[low] = temp;//支点
	return low;
}
void quik_sort(int*L, int low, int high)
{
	if (low < high)
	{
		int pl = partition(L, low, high);
		quik_sort(L, low, pl - 1);
		quik_sort(L, pl + 1, high);
	}
}
int main()
{
	int narry[100], addr[100];
	int sum = 1, t;
	cout << "Input number:" << endl;
	cin >> t;
	while (t != -1)//输入-1则停止输入数组元素
	{
		narry[sum] = t;
		addr[sum - 1] = t;
		sum++;
		cin >> t;
	}
	sum -= 1;
	quik_sort(narry, 1, sum);
	for (int i = 1; i <= sum;i++)
		cout << narry[i] << '\t';
	cout << endl;
	int k;
	cout << "Please input place you want:" << endl;
	cin >> k;
	int aa = 1;
	int kk = 0;
	for (;;)
	{
		if (aa == k)
			break;
		if (narry[kk] != narry[kk + 1])//找到第一个开始重复的数字的位置
		{
			aa += 1;
			kk++;
		}
	}
	cout << "The NO." << k << "number is:" << narry[sum - kk] << endl;
	cout << "And it's place is:";
	for (int i = 0;i < sum;i++)
	{
		if (addr[i] == narry[sum - kk])
			cout << i << '\t';
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值