#快速排序笔记
核心思想
一般以区间的最左边值或最右边值作为基准值
在区间内,此处以最右边的值为基准值。
设除了基准值的最左值为左哨兵、最右值为右哨兵。
左哨兵从左往右扫描,右哨兵从右往左扫描。
(1)左哨兵先扫描,当左哨兵发现比基准值大的时候停下;(2)当右哨兵发现比基准值小时停下;(3)当左右哨兵停下时交换两者的值,然后继续;(4)如果左哨兵遇到右哨兵则基准值的位置已确定,将右哨兵位置与基准值交换。
这样,比基准值大的都在基准值右边,比它小的都在左边,然后用递归将所有数值排序。
(如果以最左值为基准值,就右哨兵先扫描)
代码如下:
#include<stdio.h>
int main()
{
void quickSort(int a[],int left,int right);
int a[8]={43,52,10,39,91,100,43,67};
int i;
quickSort(a,0,7);
for(i=0;i<8;i++)
{
printf("%4d",a[i]);
}
return 0;
}
void quickSort(int a[],int left,int right)
{
int i,j,temp;
i=left;
j=right;
temp=a[left];//此处用最左为基准值
if(left>=right)
return;
while(i!=j)
{
while(a[j]>=temp&&j>i)
j--;//当右边的小于temp时停
while(a[j]<temp&&j>i)
{
a[i++]=a[j];
a[j]=temp;
while(a[i]<=temp&&j>i)
i++;//左边的>temp停
while(a[i]>temp&&j>i)
{
a[j--]=a[i];
a[i]=temp;
}
}
}
quickSort(a,left,i-1);//ok后的递归左边
quickSort(a,i+1,right);//ok后的递归右边
}
/*
最左边标记为L
最右标记为R
basic基准值
R当左移动,当R小于basic停止移动
L向右移动,当L大于basic停止移动
当都停止时,交换L和R的值
继续相同的步骤
当L=R时,两标记停止移动
将该数字与basic交换
从而收集左边小于basic的集合,右边收集大于basic的集合。
然后通过递归进行排序
*/