快排:
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;
}