递归法快速排序

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); }



以上是关于递归法快速排序的主要内容,如果未能解决你的问题,请参考以下文章

分治法应用之二分查找 快速排序递归排序

递归法快速排序

快速排序-递归实现

快速入手八大排序,带你从入门到精通

C语言实现九大排序算法(建议收藏!)

C语言实现九大排序算法(建议收藏!)