/*快速排序(分治法)原理:是对冒泡排序的一种改进,基本思想是通过一趟排序以待排第一个数据(或最后一个数据)为支点,将待排数据分割成独立的两部分,其中一部分数据均比另一部分数据小,则可分别对这两部分数据继续进行排序,以达到整个序列有序。时间复杂度:平均: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;}
新闻热点
疑难解答