/*快速排序(分治法)原理:是对冒泡排序的一种改进,基本思想是通过一趟排序以待排第一个数据(或最后一个数据)为支点,将待排数据分割成独立的两部分,
其中一部分数据均比另一部分数据小,则可分别对这两部分数据继续进行排序,以达到整个序列有序。
时间复杂度:平均: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;
}
数组第k大的元素的位置
最新推荐文章于 2023-02-09 21:16:15 发布