前言
随着C语言编程学习的不断深入,我逐渐也发现并掌握了很多的排序算法,从最开始的冒泡,选择,再到后来的桶排序,快速排序等,目前使用起来都很流畅,不过个人感觉还是快排好用些(我也是后来才知道c++可以直接一个函数排序,这也太方便了吧),故想写一下我对快速排序的一些看法与心得。
一、快速排序的优点
快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的,都是 O(N2),它的平均时间复杂度为 O (NlogN)。其实快速排序是基于一种叫做“二分”的思想。
二、使用步骤
1.代码(学自《啊哈!算法》)
#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,要先从右往左找
while(a[j]>=temp && i<j)
j--;
//再从左往右找
while(a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)//当哨兵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);//继续处理右边的,这里是一个递归的过程
}
int main()
{
int i,j,t;
//读入数据
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n); //快速排序调用
//输出排序后的结果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
getchar();getchar();
return 0;
}
2.快排原理
这是一种基于二分思想的算法,所以自然是要用到二分法,每排一次序前都会设置一个基准数,排完后会发现它左边的数都比他小,右边的数都比它大(这里是按升序来讲的),这样排起来会非常快。形象描述的话就需要借助《啊哈!算法》里的图来解释。
如下:
总结
我也只是简单的介绍了一下快速排序,作为我目前使用最多的排序方式,个人感觉使用起来也是非常方便的。
希望这篇文章对大家有帮助!谢谢大家的浏览。