快速排序的一般过程
快速排序是一种基于分治技术的重要排序算法。
实现过程是每次从排序的序列中选出一个基准值(下文都是以序列左边第一个数为基准,record),left指针指向第一个基准值。
- 然后从序列的最右边(right指针)开始,当right指针指向的值大于record值时,right指针减1,继续比较。
当遇到比基准值小的数(*right<record),就将right指针所指向的值赋给left指针所指向的地址,然后left加1,left指针指向下一个值。 - 当left指针指向的值都小于记录值(record)时,指针继续向后移动。
当*left>record时,将left指针指向的值赋给right指针指向的地址。然后right指针减1,指向前一个值。
重复上面的12两步,直到 left>=rigt 。此时,将记录值赋给left或right所指向的值。
此时,已经将比基准值大的数都移到了右边,比基准值小的都移动到了左边。然后对序列的左边重复上述过程,对序列右边重复上述过程。。直到最后变成单个的元素,就行成了有序的序列。
快速排序过程样例图解
样例按照基准数分类,小的在左边,大的在右边
以6,2,7,8,9,4,5,0,3 为例:
以第一个数6为基准(每次都以最左边的数为基准),并将6记录下来:
( left:左边 right:右边)
首先将6记录下来,left指针指向最左边的数,right指向最右边的数
left一开始是作为基准数的,所以从右边right开始比较。right>record,此时,将right所指向的值赋给left(right不用做更改,总有一个相同的,换到最后直接将记录的值给left或者right)
赋值后将left加1,然后将left值与record进行比较。
如果小则left继续加1.大则将left值赋给right。
right被赋值之后将right-1.
然后比较right指向的值,如果right<record,则将right值赋给left。否则继续减1.
赋值后left加一,比较left和record值,left>record,将left的值赋给right
right被赋值后,right减1。
减一后的right<record,则将right赋给left,left加一。
减一后的left>record,将left值赋给right,right减1.
减一后的right<record,则将right赋给left,left加1。
当left>=right时,表示分组完毕,此时,将记录的值赋给left或right。
左边
选择新的基准数3,并且记录下来。排序过程如下。
白色代表已经排好。
排序完成
c语言代码
#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
void Quick_Sort(Elemtype *left,Elemtype *right) //快速排序
{
Elemtype record,*i,*j,*p2;
if(left>=right) //就剩一个的话直接返回
return ;
p2=left;
i=left; //对left,right进行赋值,记录下基准值
j=right;
record=*left;
while(i<j) //当left>=right时,结束循环
{
while(i<j&&(*j)>record) //先从右边开始比起 ,遇到比基准值小的进行对left赋值
j--;
if(i<j)
{
*i=*j;
i++;
}
while(i<j&&(*i)<record) //左边找大于基准值的数,然后对right赋值
i++;
if(i<j)
{
*j=*i;
j--;
}
}
*i=record; //将基准值赋给left(或right)
Quick_Sort(left,i-1);//对基准值左边排序
Quick_Sort(i+1,right);//对基准值右边排序
return ;
}
int main()
{
int num;
char flag;
Elemtype *p1,*p2;
printf("请输入要排序的数的个数\n");
scanf("%d",&num);
p1=(Elemtype*)malloc(num*sizeof(Elemtype)); //分配空间
if(!p1)
{
printf("分配不成功\n");
exit(0);
}
printf("请输入排序数\n");
p2=p1;
for(;p2<p1+num;p2++)//输入排序数
{
scanf("%d",p2);
}
Quick_Sort(p1,p1+num-1);
p2=p1;
printf("排序后的结果为\n");
for(;p2<p1+num;p2++)
{
printf("%d ",*p2);
}
return 0;
}
运行结果: