常用的排序算法

本文主要对一些基础排序算法进行温故。子曰:“温故而知新,可以为师矣?!?/p>

common-sort.png

插入排序---直接插入排序

基本思想:将一个记录插入到已经排好序的有序列表中,从而得到新的有序列表。

平均时间复杂度:O(n2)
平均空间复杂度:O(1)

  1. 令i从i递增到n-1,重复(2)~(4)
  2. 将元素Si保存到临时变量中
  3. 确定使得条件Sj>=Si成立的最小j
  4. 将子序列{Sj...Sj-1}后移一个位置到{Sj+1...Sj}
  5. 将保存在临时变量中的Si复制到Sj+1

实现代码:

public void insertSort(int [] a){
    int len = a.length;
    for(int i = i;i<len-1;i++){
        int temp = a[i]; //临时存储a[i]
        int j = j-1; //小于i的索引,都认为是已经排好序的
        while(j>=0 && temp<a[j]){
            a[j+1]=a[j]; //将数据向右移动一位
            j--;
        }
        a[j+1] = temp; //找到插入的位置,将临时存储的a[i],赋值到j+1
    }
}

插入排序---希尔排序

平均时间复杂度:O(n3/2)
平均空间复杂度:O(1)

基本思想:取一个小于n的整数d1,作为第一个增量,将数组分成d1组,在各组内进行插入排序;然后去第二个增量d2<d1,重复以上的操作,直到dt=1。

代码实现:

public void shellSort(int [] a){
    int datalen = a.length/2;
    while(datalen >0){
        for(int i=datalen;i<a.length;i++){
            int pointer = i-datalen;
            int temp = a[pointer];
            while(pointer>=0 && temp<a[pointer]){
                a[pointer+datalen]=a[pointer];
                pointer-=datalen;
            }
        a[pointer+datalen]=temp;
        }
      datalen = datalen/2;
    }
}

交换排序---冒泡排序

平均时间复杂度:O(n2)
平均空间复杂度:O(1)

基本思想:根据轻气泡不能在重气泡之下的原则,从下往上扫描,凡是违背这一原则的的轻气泡就使之向上“漂浮”,直到最后任意两个气泡都是轻者在上,重者在下为至。

  1. 令i从n-1递减到1,重复步骤(2)~(4)
  2. 令j从0递增到i,重复步骤(3)
  3. 如果元素Sj-1和Sj成反序,交换它们
  4. 结束标记,序列{S0...Si}被排序且Si最大

代码实现:

public void bubbleSort(int [] a){
    for(int i = a.length;i>0;i--){
        for(int j = 0;j<i;j++){
            if(a[j+1] < a[j]){
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;    
            }
        }
    }
}

交换排序---快速排序

平均时间复杂度:O(nlogn)
平均空间复杂度:O(logn)

基本思想:采用了一种分治的策略,分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题,递归地解这些子问题,然后将这些子问题的解组合为原问题的解。有3个步骤:

  1. 分解:将原问题分解为若干个子问题
  2. 求解:递归地解决这些子问题,若子问题的规模足够小,直接求解
  3. 组合:将各子问题的解组合原问题的解

代码实现:

public void quickSort(int [] a,int low,int hi){
    if(low>=hi) return;
    int j = partition(a,low,hi);
    quickSort(a,low,j-1);
    quickSort(a,j+1,hi);
}


public int partition(int [] a,int low,int hi){
    int temp = a[low];
    int i = low;
    int j = hi;
    while(i<j){
        while(i<j;temp<a[j]){
            j--;
        }
       exch(a,i,j);
        while(i<j;temp>a[i]){
            i++;
        }
        exch(a,i,j);
    }
  return j;
}


public void exch(int [] a ,int i,int j){
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

选择排序---直接选择排序

平均时间复杂度:O(n2)
平均空间复杂度:O(1)

基本思想:在第i次排序时,有序区S[1..i-1]和无序区S[i...n],取无序区一个最小值记录R[k],将R[k]与无序区第一个记录交换,使得S[1..i]和S[i+1..n]成为新的有序区和无序区。

代码实现:

public void selectSort(int [] a){
    for(int i = 0;i<a.length;i++){
        int minVal = Integer.MAX_VALUE;
        int minIndex = 0;
        for(int j = i;j<a.length;j++){
            int temp = a[j];
            if(temp<minVal){
                minVal = temp;
                minIndex = j;
            }
        }
        exch(a,i,minIndex);
    }

}

选择排序---堆排序

平均时间复杂度:O(nlogn)
平均空间复杂度:O(1)

基本思想:首先堆具有下列完全二叉树的性质:每个节点的值都大于或等于其左右孩子的值,称为大顶堆;或者每个节点的值都小于等于其左右孩子的值,称为小顶堆。利用这一性质,将待排序的数据构建成一个大顶堆或者小顶堆,将根结点与数据末端的元素交互,并移除数据末端元素,然后n-1继续重构一个堆,如此反复执行。

代码实现:

public void heapSort(int len){
    for(int i = len/2;i>0;i--){
        heapAjust(i,len);
    }
    for(int i = len; i>0;i--){
        exch(1,i);
        heapAjust(1,i-1);
    }
}

public void heapAjust(int s,int len){
    int temp , j;
    temp = arr[s];
    for(j=2*s;j<=len;j*=2){
        if(j<len && arr[j]<arr[j+1]){
            j++
        }
        if(temp>=arr[j])
            break;
        arr[s] = arr[j];
        s = j;
    }
    arr[s] = temp;
}

欢迎关注我的个人订阅号

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

推荐阅读更多精彩内容