使用快速排序,求最大的k个数

来源:互联网 发布:生日祝福网站源码 编辑:程序博客网 时间:2024/06/05 14:41
使用选择排序的思想:时间复杂度o(n*k)

#include<iostream>using namespace std;void selectMax(int arr[],int n,int k){for(int j = 0; j < k; ++j){for(int i = 0; i < n - j - 1; ++i){if(arr[i] > arr[i + 1])swap(arr[i],arr[i + 1]);}}}void selectSort(int arr[],int n){for(int i = 0; i < n - 1; ++i){for(int j = 0; j < n - i - 1; ++j){if(arr[j] > arr[j + 1])swap(arr[j],arr[j + 1]);}}}void swap(int &a,int &b){int temp = a;a = b;b = temp;}int main(void){int arr[] = {3, 5, 4, 8, 9, 10, 1, 2};//selectSort(arr,8);selectMax(arr,8,2);//最的两个数位于数组的最后。for(int i = 0; i < 8; ++i){cout<<arr[i]<<endl;}system("pause");return 0;}

快速排序的思想解决。o(n*logk)

#include<iostream>using namespace std;int partition(int arr[],int p,int r)//每一次划分所产生的结果{int x = arr[r];//选择末尾元素作为枢轴int i = p -1;for(int j = p; j < r; ++j){if(arr[j] > x){i++;swap(arr[i],arr[j]);}}swap(arr[i + 1],arr[r]);return i + 1;}//begin代表开始的位置,end代表的结束的位置,k为最大的k+1个数void kBig(int arr[],int begin,int end,int k){int i = partition(arr,begin,end);if(k == i)//如果划分的结果刚好为枢轴所在的位置,则返回return;else if(k > i)//如果枢轴的位置小于k,则递归的进入右区域{kBig(arr,i + 1,end,k);}else//否则进入左区域{kBig(arr,begin,i - 1,k);}}int main(void){int arr[] = {2, 8, 7, 1, 3, 5, 6, 4, 11, 13, 14, 15, 19, 16, 20, 21, 78, 32, 100, 10};partition(arr,0,7);kBig(arr,0,19,4);for(int i = 0; i < 20; ++i){cout<<arr[i]<<endl;}system("pause");return 0;}

0 0
原创粉丝点击