十大经典排序算法之快速排序
近些日子突然想回顾下十大经典排序算法,于是就找空余时间用c语言实现一下,就当是回顾和复习了,今天我们就来讲讲快速排序算法
快速排序算法是十大经典排序算法其中的一个,其思想主要就是将一组没有顺序的数字,首先在这组数字里先找一个数字作为基准数,一般地都会用这组数字的第一个数或者最后一个数作为基准数。在这里我们选择这组数据的第一个数作为基准数。然后设置两个游标,我们将前游标指向第一个数,然后我们将后游标指向这组数据的最后一个数。然后从后游标往左,当找到比基准数字小的数字的时候,我们就将这个数和前游标指向的数字交换,然后前游标自增(加一,或者说前游标向后移动一位)。然后我们从前游标开始往右找,当找到比基准数字大的数的时候,我们就将这个数和后游标目前所指的数字进行交换。然后后游标自减(减一,或者说后游标向前移动一位)。然后重复上述步骤,直到后游标等于前游标的时候,此次排序结束。
但是,要注意的是,上述排序的过程,只是将比基准数小的放在了基准数字左边,比基准数字大的,放在了基准数字右边,所以要想完全的将这组数据排序完成。我们还需要进一步排序,其实在上面我们就将数组划分成两个部分,一个部分比基准数字小的,一个部分是比基准数字大的,所以我们接下来只需要对这两个部分进行再次排序就行了,将左边的部分再次划分成两部分,直到最后不能继续划分,此时排序完成。说了这么多,可能有的同学还是不太理解,我们画个简单的示意图来辅助大家理解,如下图:
/* 经典排序算法:快速排序算法的c语言实现 */
#include<stdio.h>
#include<stdlib.h>
//展示数组元素的函数
void display(int a[],int len){
int i = 0;
while(i<len){
printf("%d ",a[i++]);
}
printf("\n");
}
//交换两个数的函数
void swap(int *first,int *second){
int temp;
temp = *first;
*first = *second;
*second = temp;
}
//将数组元素划分成两个部分,比基准元素大的和比基准元素小的
int sort(int a[],int start,int end){
int standard = a[start];
int low = start;
int high = end;
while(low<high){
while(low<high && a[high]>=standard){
high--;
}
if(low<high){
swap(&a[low],&a[high]);
low++;
}
while(low<high && a[low]<=standard){
low++;
}
if(low<high){
swap(&a[low],&a[high]);
high--;
}
}
a[low] = standard;
return low;
}
//快速排序函数
void quickSort(int a[],int start,int end){
if(start<end){
int pos = sort(a,start,end);
quickSort(a,start,pos-1);//递归调用
quickSort(a,pos+1,end);//递归调用
}
}
int main(void){
int len = 0;
int *p;
int i;
printf("请输入排序的数组长度:\n");
scanf("%d",&len);
getchar();//读走输入流的回车字符
p = (int *)malloc(sizeof(int)*len);
printf("请输入排序的数字:\n");
for(i = 0;i<len;i++){
scanf("%d",&p[i]);
}
printf("排序前的数组:\n");
display(p,len);
quickSort(p,0,len-1);
printf("排序后的数组:\n");
display(p,len);
free(p); //释放内存
return 0;
}
简单介绍下上述代码,display函数形参有两个一个是整形数组,一个是数组的长度,这个函数的功能是将数组里的元素输出到控制台上。swap函数的功能就是交换两个数字的值。然后就是sort函数,将数组元素划分成两个部分,一个部分是比基准元素要小的部分,另外一个部分是比基准元素要大的部分。而在quickSort函数里,我们调用sort函数从而得到我们划分好了的基准元素所在的下标,然后以这个下标为界,将前面一部分数据再进行排序,后面一部分数据再进行排序直到结束。
下面给出代码运行结果: