找出无序数组最小的K个数(基于快排,效率高)
生活随笔
收集整理的這篇文章主要介紹了
找出无序数组最小的K个数(基于快排,效率高)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
快排:
void QuickSort(int array[], int low, int high) { if (low >= high) //為了防止無限遞歸下去,導致棧溢出,設置此條件 { return; } int pivotkey = array[low]; //設置一個對照元素,把這個元素先暫時拿出來,想象它的位置的左邊都比它大,右邊都比它小,空出位置用來存放比對照元素小的元素 int iLow = low; int iHigh = high; while (low < high) { while (low < high && array[high] <= pivotkey) { high--; } array[low] = array[high]; //從右邊往左邊找,直到找到一個比對照元素要大的元素,放到對照元素的前面 while (low < high && array[low] >= pivotkey) { low++; } array[high] = array[low]; //然后從左往右找,直到找到一個比對照元素要小的元素,放到對照元素的后面 } array[low] = pivotkey; //最后在中間放置對照元素,這時候左邊的數據都比大的數據,右邊的數據都是小的數據 QuickSort(array, iLow, low - 1); //對照元素左邊的數據再次進行以上排序 QuickSort(array, low + 1, iHigh); //對照元素的右邊數據再次進行以上排序 }找出最小的K個數
#include <iostream> using namespace std;void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp; } void GetLeastNumbers_Solution(int input[],int start, int end, int k) {int key = input[0];int left = start;int right = end;while(left < right){while(left < right && key <= input[right])--right;swap(&input[left], &input[right]);while(left < right && key >= input[left])++left;swap(&input[left], &input[right]);}if(left+1 < k)GetLeastNumbers_Solution(input, left+1, end, k-left-1);if(left+1 > k)GetLeastNumbers_Solution(input, start, left-1, k); }int main() {int k = 4; int arr[] = {4,5,1,6,2,7,3,8};GetLeastNumbers_Solution(arr, 0, 7, k);for(int i = 0; i < k; ++i){cout<<arr[i]<<" ";}return 0; }總結
以上是生活随笔為你收集整理的找出无序数组最小的K个数(基于快排,效率高)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫练习--爬取CNNVD相关漏洞
- 下一篇: 如何使用CppUnit进行单元测试