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