快速排序法—递归函数
快速排序
即将一组有序数进行排序(由大到小)
排序思想
概要:
冒泡法是将第一个数作为标准与下面的数进行一一比较。快速排序时间复杂度较大。
快速排序是将一个数作为标准指派两个数进行比较(好处:这两个数若提示满足即可交换)。
主要思想:
设定两个判断交换数(与基准作比较),相当于两个哨兵(左哨兵、右哨兵)。
!!!接下来要做的就是把小于基准的放在基准左边,大于基准的放在基准右边。
1.发出信号(发出一个基准)设定第一个为基准,这样比较好执行。此后左右两个哨兵都以这个基准做判断。
2.右哨兵开始判断如果大于基准就向左移动,因为此时的数是满足要求的。如果小于基准那么就给左哨兵发信号。
##2.1 此时让左哨兵找满足的数来与右哨兵交换。
3.第二步执行的条件:即左右哨兵不相遇,如果相遇说明这个数组已经被处理完。
4.当左右哨兵相遇说明此时哨兵左面的数都是小于基准的,右面的数都是大于基准的,此时交换相遇位置与基准位置的数(此时相遇位置的数一定是小于基准的,因为是右哨兵先判断的他每占据的一步都是需要交换的当碰面时即右哨兵已经走进了小于基准的区域,所以可以交换)。图中在1处相遇。
5.此时已经将这个数组划分成了左右两个区,左区是小于基准的,右区是大于基准。然后使用递归思想继续对左右两个区进行上面的快速排序。
代码
#include<stdio.h>
int a[10]={4,8,5,9,1,10,3,2,7,6};
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)//执行条件:没有相遇
{
while(a[j]>=temp&&i<j)//找到了比基准小的数,准备交换,让右哨兵判断
j--;
while(a[i]<=temp&&i<j)//找到了比基准大的数,准备交换
i++;
if(i<j)//执行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];//交换基准与 相遇位置的数
a[i]=temp;
quicksort(left,i-1);//递归执行分好的区域
quicksort(i+1,right);
return;
}
void main()
{ int i;
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
quicksort(0,9);
for(i=0;i<10;i++)
printf("%d ",a[i]);
}