// 如果可以修改原数组,可以使用快排的patition函数intquick_sort_partition(int a[],int left,int right){if(a ==nullptr|| left <0|| right <0|| left > right){return-1;}int pivot = a[n-1];int i =0;int j =-1;for(i=0; i<n; i++){if(a[i]< pivot){
i++;if(i != j){swap(a[i], a[j]);}}}
j++;swap(a[i], a[j]);return j;}intleast_k_num(int a[],int n,int k){if(a ==nullptr|| n <=0|| k <=0|| k > n){return-1;}int left =0;int right = n -1;int pivot =quick_sort_partition(a, left, right);if(pivot <0){return-1;}while(pivot != k -1){if(pivot < k -1){
left = pivot +1;}else{
right = pivot -1;}
pivot =quick_sort_partition(a, left, right);if(pivot <0){return-1;}}for(int i =0; i < k; i++){
cout << a[i]<<" "}
cout << endl;return0;}// 使用最大堆排序,这个方法可以处理大量的数据,以及不需要修改原数组// 完全二叉树// i的子节点的2i+1 2i+2, 父节点为(i-1)/2// 子节点都比父节点小// 左右子树都是大根堆// 最大的非叶子节点为(n - 1)/2// 数组其实为0开始intcreat_max_heap(int a[],int n){if(a ==nullptr|| n <=0){return-1;}for(int i =(n-1)/2; i >=0; i--){adjust(a, n, i);}}intadjust(int a[],int n,int i){if(a ==nullptr|| n <=0|| i <0|| i > n){return-1;}int max = i;int left =2* i +1;int right =2* i +2;if(left < n && a[left]> a[max]){
max = left;}if(right < n && a[right]> a[max]){
max = right;}if(max != i){swap(a[max], a[i]);adjust(a, n, max);}return0;}intleast_k_num(int a[],int n,int k){if(a ==nullptr|| n <=0|| k <=0|| k > n){return-1;}int*max_array =newint[k];for(int i =0; i < k; i++){
max_array[i]= a[i];}int ret =creat_max_heap(max_array, k);if(ret <0){return ret;}for(int i = k; i < n; i++){if(max_array[0]> a[i]){
max_array[0]= a[i];adjust(a, k ,0);}}for(int i =0; i < k; i++){
cout << max_array[i]<<" ";}
cout << endl;delete[] max_array;return0;}
// 如果可以修改原数组,可以使用快排的patition函数int quick_sort_partition(int a[], int left, int right) { if (a == nullptr || left < 0 || right < 0 || left > right) { return -1; } int pivot = a[n-1]; int i = 0; int j = -1; for (i=0;