快速排序的简单实现

来源:互联网 发布:rmvb视频剪辑软件 编辑:程序博客网 时间:2024/05/17 23:56

本文的主题即用C语言简单实现快速排序。

《算法导论》上面讲的跟严蔚敏的《数据结构》上面讲的是不一样的。

《数据结构》(严版)上面是,先确定pivot key之后,再依次交替地从后往前调,从前往后调。一次partition下来,基本就确定小于pivot key的值已经排到左边,大于它的值已经排到右边。然后递归,基本算法就实现了。

《算法导论》上面的思路则是,在确定以未排序数组最后一元素为pivot之后,从前往后(a[0]~a[n-2])遍历数组,当遇到小于等于pivot的元素之后,将其与前面(左边)大于pivot的值互换(其实现依赖于一个额外的下标),所有小于等于pivot值的元素都调到左边之后,再将数组最后一元素(即a[n-1])与此时数组的第一个大于pivot的值互换。至此partiton()函数已经实现,然后还是递归实现整个算法。

刚开始没怎么看《算法导论》,也没按严奶奶书上讲的来,就想着以自己的方法来实现,哪晓得大半天之后还是没有实现。于是想着算法跟编程,都是一丢就忘的东西,而早该惭愧的我,确实好像很久没有碰这些东西了,竟然把swap()函数的实现都写错了……

哎,加油!

附完整可实现C代码:

//by Haiyuan//2012/11/2#include <stdio.h>void swap(int &, int &);int partition(int *,int ,int);void quicksort(int *,int ,int );void main(){int a[10];printf("请输入原始数据:\n");for(int i=0;i<10;i++)scanf("%d",&a[i]);quicksort(a,0,9);printf("排序结果如下:\n");for(int i=0;i<10;i++)printf("%d\t",a[i]);}void swap(int &a,int &b){int temp;temp=a;a=b;b=temp;}int partition(int *a,int p,int r){//算法导论版partition()函数的C语言实现//by Haiyuanint pivot=a[r];int i=p-1;for(int j=p;j<r;j++) //确保小于pivot的值全部安排到数组的低端{if (a[j]<=pivot)swap(a[++i],a[j]);}swap(a[++i],a[r]);//确保pivot的临界属性:左边的都小于等于pivot,右边的都大于pivotreturn i;}void quicksort(int *a,int p,int r){int q;if (p<r){q=partition(a,p,r);quicksort(a,p,q-1);quicksort(a,q+1,r);}}