快速排序
来源:互联网 发布:汕头网络 编辑:程序博客网 时间:2024/06/16 22:55
在内部排序中,快速排序被认为是目前最好的一种排序。
快速排序算法的基本思想:
人的思维导向:
在要排序序列中任选取一个元素,把该元素称为基准元素或支点(枢轴),把小于等于支点的所有元素都移到支点前面(序列左边),把大于支点的所有元素都移到支点后面(序列右边),这样就使得支点所处的位置恰为排序的最终位置,并且把总序列分为前后两个子序列,上述称为一趟快速排序或是一次划分(所以我个人又把该排序叫做划分排序,这样更容易理解)。接下来分别对这两个子序列重复上述操作(子序列长度大于1时),直到所有元素都移到它们最终的位置。不难看出该算法具有递归特性。
在计算机上实现(一次划分过程):
假设原序列为:{6,9,8,3,11,5,7}。
首先设置两个变量i和j。令i=1,指向第一个元素6;j=7,指向最后一个元素7。
设支点为i指向的元素6(此处指向任意)
(1)反复执行i=i+1,直到i指向的元素大于等于支点6,或是i指向序列尾部,即i=7为 止。然后反复执行j=j-1,直到j指向的元素小于等于支点6,或是j指向序列首部,即j=1为止。(以从小到大排序为例)
(2)若此时i 小于 j,即i在j的左边,则将i与j指向的元素交换(一次交换)。然后重复 执行(1)(2),直到i 大于等于 j为止。
(3)此时i 大于等于 j,然后将支点与j指向的元素交换位置。
至此就完成了第一次划分,此时支点6在排序的最终位置。
接下来再对子序列进行划分,每次划分支点仍可选第一个。
由于快速排序算法特性的约束,一般只适用于顺序表线性结构或数组序列的排序,并不适合在链表结构上实现排序。
例:编写一个c程序,实现数据序列{3,5,2,7,6,9,8,12}的快速排序。要求从大到小,并输出排序后的数列。
#include"stdio.h"void swap(int *a,int *b) //序列中元素位置的交换 { int tmp; tmp = *a; *a = *b; *b = tmp;}void quicksort(int k[],int s,int t) //快速排序 ,s为数组首标,t为数组尾下标{ int i,j; if(s<t) { i=s; j=t+1; while(1) { do i++; while(!(k[s]>=k[i]||i==t)); do j--; while(!(k[s]<=k[j]||j==s)); //当跳出do while意味着移动停止,出现了不符合的一对数 if(i<j) swap(&k[i],&k[j]); else break; } swap(&k[s],&k[j]) //交换支点与k[j]的位置 quicksort(k,s,j-1); //递归排序前面子序列,都是用的第一个元素作为支点 quicksort(k,j+1,t); //递归排序后面的子序列 } } main() { int k[8]={3,5,2,7,6,9,8,12}; int i; printf("The orginal data array is:\n"); for(i=0;i<10;i++) printf("%d",k[i]); quicksort(k,0,9); printf("\nThe result of quick sorting for array is\n "); for(i=0;i<10;i++) printf("%d",k[i]); getche(); }