思路1:我們通過快排找到第k個數,然後比他的小的都在左邊,比他大的都在右邊。
思路2:應對大數據的情況,首先取數組中前k個數字建立大根堆,建立堆之後,從第k+1個元素開始,和堆頂元素進行比較,如果小於堆頂的元素,那麼就替換堆頂的元素
1 #include "stdafx.h" 2 #include<iostream> 3 #include<set> 4 #include<vector> 5 #include<stdlib.h> 6 #include<tchar.h> 7 #include<exception> 8 using namespace std; 9 10 int RandomInRange(int min, int max) 11 { 12 int random = rand() % (max - min + 1) + min; 13 return random; 14 } 15 16 void Swap(int* num1, int* num2) 17 { 18 int temp = *num1; 19 *num1 = *num2; 20 *num2 = temp; 21 } 22 23 int Partition(int data[], int length, int start, int end) 24 { 25 if(data == NULL || length <= 0 || start < 0 || end >= length) 26 //throw std::exception("Invalid Parameters"); 27 exit(1); 28 29 int index = RandomInRange(start, end); 30 Swap(&data[index], &data[end]); 31 32 int small = start - 1; 33 for(index = start; index < end; ++ index) 34 { 35 if(data[index] < data[end]) 36 { 37 ++ small; 38 if(small != index) 39 Swap(&data[index], &data[small]); 40 } 41 } 42 43 ++ small; 44 Swap(&data[small], &data[end]); 45 46 return small; 47 } 48 49 //=====================方法1====================== 50 void GetLeastNumbers_Solution1(int* input, int n, int* output, int k) 51 { 52 if(input == NULL || output == NULL || k > n || n <= 0 || k <= 0) 53 return; 54 55 int start = 0; 56 int end = n - 1; 57 int index = Partition(input, n, start, end); 58 while(index != k - 1) 59 { 60 if(index > k - 1) 61 { 62 end = index - 1; 63 index = Partition(input, n , start, end); 64 } 65 else 66 { 67 start = index + 1; 68 index = Partition(input, n, start, end); 69 } 70 } 71 72 for(int i = 0; i < k; ++i) 73 output[i] = input[i]; 74 } 75 76 //====================方法2====================== 77 typedef multiset<int, greater<int> > intSet; 78 typedef multiset<int, greater<int> >::iterator setIterator; 79 80 void GetLeastNumbers_Solution2(const vector<int>& data, intSet& leastNumbers, int k) 81 { 82 leastNumbers.clear(); 83 84 if(k < 1 || data.size() < k) 85 return; 86 87 vector<int>::const_iterator iter = data.begin(); 88 for(; iter != data.end(); ++iter) 89 { 90 if((leastNumbers.size()) < k) 91 leastNumbers.insert(*iter); 92 93 else 94 { 95 setIterator iterGreatest = leastNumbers.begin(); 96 97 if(*iter < *(leastNumbers.begin())) 98 { 99 leastNumbers.erase(iterGreatest); 100 leastNumbers.insert(*iter); 101 } 102 } 103 } 104 } 105 106 int main() 107 { 108 109 int data[] = {4, 5, 1, 6, 2, 7, 3, 8}; 110 int length = sizeof(data) / sizeof(int); 111 int k = 4; 112 113 printf("The data is:\n"); 114 for(int i = 0 ; i < length ; ++i) 115 printf("%d\t", data[i]); 116 printf("\n\n"); 117 118 vector<int> vectorData; 119 for(int i = 0; i < length ; ++i) 120 vectorData.push_back(data[i]); 121 122 printf("Result for solution1:\n"); 123 124 int* output = new int[k]; 125 GetLeastNumbers_Solution1(data, length, output, k); 126 127 for(int i = 0 ; i < k ; ++i) 128 printf("%d\t", output[i]); 129 printf("\n\n"); 130 131 delete[] output; 132 133 printf("Result for solution2:\n"); 134 135 intSet leastNumbers; 136 GetLeastNumbers_Solution2(vectorData, leastNumbers, k); 137 138 printf("The actual output numbers are:\n"); 139 140 for(setIterator iter = leastNumbers.begin(); iter != leastNumbers.end(); ++iter) 141 printf("%d\t", *iter); 142 printf("\n\n"); 143 144 145 return 0; 146 }