递归法快速排序
Posted 嵌入式单片机之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归法快速排序相关的知识,希望对你有一定的参考价值。
快速排序,说白了就是给基准数据找其正确索引位置的过程.
快排的关键在于现在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移动到数组的左边,比选择的数字大的数字移动到数组的右边。
三步走:
①先从队尾开始向前扫描且当low < high时,如果a[high] > tmp,则high–,但如果a[high] < tmp,则将high的值赋值给low,即arr[low] = a[high],同时要转换数组扫描的方式,即需要从队首开始向队尾进行扫描了
②同理,当从队首开始向队尾进行扫描时,如果a[low] < tmp,则low++,但如果a[low] > tmp了,则就需要将low位置的值赋值给high位置,即arr[low] = arr[high],同时将数组扫描方式换为由队尾向队首进行扫描.
③不断重复①和②,知道low>=high时(其实是low=high),low或high的位置就是该基准数据在数组中的正确索引位置.
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);
}
以上是关于递归法快速排序的主要内容,如果未能解决你的问题,请参考以下文章