快速排序

来源:互联网 发布:汕头网络 编辑:程序博客网 时间: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(); }
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 沈语心叶安宴全文阅读 沈凉夜叶绵全文免费阅读 沈嘉文 陈宥维沈嘉莹 沈嘉莹 沈嘉莹陈宥维 陈宥维女朋友沈嘉莹 三爷的小宠妻沈 沈国放 沈国芳 沈国雄隆鼻修复 沈国雄隆鼻怎么样 沈在元 沈坚强 沈培平 沈培一宁少辰全文免费阅读 沈培一宁少辰免费阅读 沈培一宁少辰 沈培一宁少辰免费 沈时墨秦菲菲 沈壁君 沈夜焰作品 困流by沈夜焰 沈夜焰 纯爷们与by沈夜焰 沈夜焰 yj男的春天 我只要你 沈夜焰 沈夜焰 文集 yj男的春天 沈夜焰 yj男的春天by沈夜焰 沈大成旗舰店 上海沈大成 沈娴秦如凉 千苒君笑 沈钰南衡帝君 沈天君守护 沈天君守护 沈妙言君天阑免费阅读 沈奕斐 沈如筠 沈婷婷 沈孟生 沈安娜个畜生