快速排序
先看一下对数字怎么快速排序
写一下过程
void quick(int num[],int start, int finish)//传入数组,开始和结尾的数组下标
{
if(start<finish)
{
int i=start,j=finish;
int x=num[start];//设置基数,也就是num[0],把值储存在x中
while(i<j)
{
while(i<j&&num[j]>x)//从右向左遍历数组,如果发现比基数小的就把他放到基数位置
j--;
if(i<j)
{
num[i]=num[j];//放到基数位置后,j的位置就空了
i++;//i向后走一个(原来i的位置储存了数num[j])
}
while(i<j&&num[i]<x)//同样的道理,从左向右遍历数组,如果发现比基数大的就把他放到上面空出来的j的位置
i++;
if(i<j)
{
num[j]=num[i];
j--;//j向前走一个(原来j的位置储存了数num[i])
}
}
num[i]=x;//出循环的时候是i==j,最后把基数放到此位置,就此实现了基数左边比他小,基数右边比他大的结果了
quick(num,start,i-1);//在i的左边再次调用quick函数
quick(num,i+1,finish);//在i的右端再次调用quick函数
}
printf(" %d %d ",start,finish);
}
int main()
{
int num[]={9,4,5,3,2,76,45,4,2,2};
int start=0;
int finish=sizeof(num)/sizeof(int)-1;//算一下最后一位对应的下标
quick(num,start,finish);
for(int i=0;i<=finish;i++)
printf("%d ",*(num+i));
return 0;
}
下面图解了一下快速排序的全过程,因为我看的图解都只有一步,后面都省略了,所以就自己画了个小图解
运行结果:
理解了快速排序,那么对字符串的快速排序也就容易了
例如对几个国家名快速排序
#include <stdio.h>
#include <malloc.h>
#include <string.h>
/*形参名都没变直接拿来用了,下面有注释的是改过的*/
void quick(char *num[],int start, int finish)//传的是一维数组指针
{
if(start<finish)
{
int i=start,j=finish;
char *x=num[start];//x变成字符串
while(i<j)
{
while(i<j&&strcmp(num[j],x)>0)//比较字符串用strcmp()函数
j--;
if(i<j)
{
num[i]=num[j];
i++;
}
while(i<j&&strcmp(num[i],x)<0)//
i++;
if(i<j)
{
num[j]=num[i];
j--;
}
}
num[i]=x;
quick(num,start,i-1);
quick(num,i+1,finish);
}
}
int main()
{
char* str[8]={"CHINA","JAPAN","KOBEA","USA","RUSSIA","UK","FRANCE","AUS"};//设置个一维数组的指针
int i;
printf("排序前:");
for(i=0;i<8;i++)
printf("%s " ,str[i]);//字符串的出
putchar('\n');
quick(str,0,7);//调用,不要下标越位
printf("排序后;");
for(i=0;i<8;i++)
printf("%s ",str[i]);
return 0;
}
结果如下:
快速排序参考:https://www.runoob.com/w3cnote/quick-sort.html