快排的关键在于现在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移动到数组的左边,比选择的数字大的数字移动到数组的右边。

int Partition(int data[],int length,int start,int end)
{
if(data==nullptr||length<=0||start<0||end>=length)
throw new std::exception("invalid parametres");
int index =RandomInRange(start,end);//生成一个随机索引
Swap(&data[index],&data[end]);
int small=start-1;
for(index=start;index<end;++index)
{
if(data[index]<data[end])
{
++small;
if(small!=index)
Swap(&data[index],&data[small]);
}
}
++small;
Swap(&data[small],&data[end]);
return small;

}

用递归的思路分别对每次选中的数字的左右两边排序,对长度为n的数组排序,把start=0,end=n-1,调用QuickSort()

void QuickSort(int data[],int length,int start,int end)
{
if(start==end)return;
int index=Partition(data,length,start,end);
if(index>start)
QuickSort(data,length,start,index-1);
if(index<end)
QuickSort(data,length,index+1,end);
}

ps:相关问题:

在长度为n的数组中查找第k大的数字

数组中出现次数超过一半的数字

最小的k个数