首页 > 学院 > 开发设计 > 正文

数组第k大的元素的位置

2019-11-11 01:22:43
字体:
来源:转载
供稿:网友
/*快速排序(分治法)原理:是对冒泡排序的一种改进,基本思想是通过一趟排序以待排第一个数据(或最后一个数据)为支点,将待排数据分割成独立的两部分,其中一部分数据均比另一部分数据小,则可分别对这两部分数据继续进行排序,以达到整个序列有序。时间复杂度:平均: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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表