三种简单的排序算法

生活中有太多需要排序的场景,电影的播放时间,美团订购商家的距离远近,淘宝商品的价格,都需要排序,当产品量很大的时候,就需要我们使用适当的排序算法。

1、桶排序

桶排序是一种简单,快速的排序,时间复杂度为O(M+N)

桶排序实现的过程形象点来说就是,一个可能一个桶,将数放入该数位置桶中,这样就自然有顺序了。比如一个班的数学考试成绩进行排序,满分是100分,这样我申请一个数组,是a[100],数组的每个元素都是0,然后如果一个学生考89分,我就让a[89]的元素+1,变为1,依次将每个学生的成绩“放入桶中”。这样就自然有顺序了。

我们用代码来实现一下:

假设班上有58(N)个学生,满分是100(M)分;

int  a[M] ;int t;

//初始化

for(i=0;i<M;i++)
a[i]=0;

//输入

for(i=0;i<N;i++){

scanf("%d",&t);//把每个学生的成绩读到变量t

a[t]++; //进行计数

}//

这样其实已经拍好循序了,剩下就是输出

for(int i=0;i<=M;i++)                                                                        
     for(j=0;j<a[i];j++) //出现几次就打印几次
           printf("%d",i);//打印桶的序号;

这样就完成了一个桶排序的操作,时间复杂度是时输入和输出的时候都是俩次的桶个数和待排序数个数的for循环,即(M+N)*2;我们在计算时间复杂度的时候可以忽略最小的常数,即这种算法的时间复杂度是O(M+N)。这是一种相当快速的排序算法,适合在M值不算太大的情况。

2、冒泡排序

冒泡排序的基本思想是:每次比较相邻的俩个数,这样实现大数下沉,小数上浮,这样就实现了排序功能.

比如12 34 23 45进行排序,想让从大到小排序,先比较12和34,这样他们就调换了位置,然后再比较第二个第三个数,12就到了第三个位置,比完N-1次之后,12就下沉到最后了,这样下次就只需要比较N-2次了.进行N-1次循环就将整个数组排序了.

代码实现:

int a[10] = {10,4,20,30,44,56,33,22,34,11};

    for(int i=0;i<10;i++){

        for (int j=0; j<10-i; j++) {

     if (a[j]<a[j+1]){

                int k = a[j+1];

                a[j+1] = a[j];

                a[j] = k;     }

}       }

for (int i = 0; i<10; i++) {  printf("%d  ",a[i]); }

冒泡排序的核心是双重嵌套循环,这种方式排序的时间复杂度是O(N²).是一个很高复杂度的算法.

3、快速排序

快速排序的过程是选中数组中的一个数作为基数,然后从左右两测查找,发现比基数小的和比基数大的就进行交换,直到最后俩个选择点相交,将相交数与基数进行交换,这样基数位置就确定了,这样数组就分为两部分,然后再分别将这两部分进行上面的操作,依次将每个数的位置确定.

例如:  int a[10] = {10,4,20,30,44,56,33,22,34,11};

进行排序,我选择10作为基数,然后必须先从最后的11开始向左数,碰到比10小的数停止,这样右边的指标会在4那里停止了,左边的指标再向右移一位就和右边的指标相遇了,这样就能确定此次基数的位置在4那里,这样将10和4进行交换,就完成了一个基数的排序了,这样数组分为左边的4,和右边的20,30,44,56,33,22,34,11, 这样我们只需要再排序右边的数组了,我们再将右边指标定位在最后的11,左边指标定位在20,还是必须先让右边指标动作,向左找比基数20小的数,这次右边指标在11那里就停止了,左边的指标开始行动,在30那里停止,两个数互换,数组变为 {4,10,20,11,44,56,33,22,34,30},然后右边指标继续移动,知道找到比20小的数,到11那里与左边指标相遇,这样就确定了此次基数20的位置,这样叫11与基数20交换就确定了20的位置,这样又完成了一个数的排序,这样依次下去,可以将整个数组排序.  这种排序方法,最坏的情况就是每次都是相邻的俩个数交换,这样的时间复杂度是和冒泡排序一样的O(N²),但是这种算法的平均复杂度是NLogN,比冒泡排序更快速.

代码实现:

 int a[10] = {10,4,20,30,44,56,33,22,34,11}; int n;

void quicksortTest(int left,int right){

    int i,j,t,temp;


    if(left>right) return;

    temp = a[left];

    i = left;

    j = right;

    while (i!=j) {

        while (a[j]>=temp&&i<j) j--;
        while (a[i]<=temp&&i<j)i++;

         if (i<j) {
            t=a[i];
            a[i]=a[j];
            a[j]=t;  }

           }

//将基准数归位

    a[left] = a[i];

    a[i] = temp;

    //递归.继续处理分开的两个数组
    quicksortTest(left, i-1);
    quicksortTest(i+1, right);
    return;

}

//调用 :

quicksortTest(0, 10);
    for (int i=0; i<10; i++) {
        printf("%d  ",a[i]);
    }

       

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,338评论 0 1
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2
  • 没有这次的协作就不会体现出自我协作达到一致性! 第一次报名主持人,第一次写主持人台词首先完全的脱离了心理的那份安全...
    平行夏阅读 468评论 2 2
  • 不知道八零后的消费观是否都是有多少花多少,曾经的自己跟老公就是典型的花钱心里没谱,一年倒头手上总剩不下什么。 为了...
    遇见喜悦阅读 248评论 0 0
  • 又到了总结一年收获得失的时候,但是心里又是空落落的。 我清清楚楚地记得在那个黄昏的下午,满地的阳光洒在我的电路试卷...
    大圣豆豆阅读 262评论 0 0