数据结构:快速排序
1、快速排序
原理 : 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。
先定义一个待end排序数组a[6]
(1)选取数组第一个元素为基准值key ;设置两个标志位begin指向数组的开头,end指向数组的末尾
(2)首先从后往前扫描,如果扫描的数值大于key值,则j自减,j–;如果扫描的数值小于key值 (如上图所示,a[end]❤️), 就将a[i]值赋值给a[i]位置 , 如下图所示:
(3)然后从前往后开始扫描,如果扫描的数值小于key,则i自增,i++;如果扫描的数值大于key,则 则就需要将i位置的值赋值给j位置,a[j] = a[i]; 如a[5] = a[2];如下图所示
(4)同理再从后往前扫描,如果扫描的数值大于key值,则j自减,j–;如果扫描的数值小于key值 (如上图所示,a[4]❤️), 就将4位置的值赋值给i位置 , a[i] = a[j],如下图所示:
(5)同理再从前往后开始扫描,如果扫描的数值小于key,则i自增,i++;如果扫描的数值大于key,则 则就需要将i位置的值赋值给j位置,a[j] = a[i];
(6)如图所示,直到i=j时,查找结束,把key值赋值给a[j];
(7)则数组就以key值为准,分为两部分,基准值key左半部分的数值都比key值小,右半部分的数值都比基准值大; 最后采用递归的方式分别对前半部分和后半部分排序,直到该数组就自然有序了。
2、总结
1、首先,设定一个基准数key;a[begin]=key,先从后往前扫描,当a[j]>a[begin]时,j–;当a[j]<key时,将a[i] = a[j];同时将扫描方式改为从前往后扫描;
2,然后,先从后往前扫描,当key>a[i]时,i++;当key<a[i]时,将a[j] = a[i];同时将扫描方式改为从后往前扫描;
3、最后,当i>=j时,将key放于a[i]的位置,则数组就以key值为准,最后采用递归的方式分别对前半部分和后半部分排序,直到该数组就自然有序了。
3、代码实现
void quick_sort(int *a,int begin,int end)
{
if (begin >= end)
{
return ;
}
int i = begin;
int j = end;
int key = a[i];
while (i < j)
{
while (i < j && key =< a[j])//当基准数key=<a[j]时,j自减,直到key>=a[j]时
{
j--;
}
a[i] = a[j];// **把a[j]赋值给a[i]**
while (i < j && key >= a[i])//当基准数key>=a[i]时,i自减,直到key<a[j]时
{
i++;
}
a[j] = a[i];// **a[i]赋值给a[j]**
}
a[i] = key;
quick_sort(a,begin,i-1);//基准数的前半部分开始递归调用快速排序
quick_sort(a,i+1,end);//基准数的后半部分开始递归调用快速排序
}