Java常用的排序算法

一.概述

排序算法在程序开发过程中可能用的比较少,但是也很有必要了解一下。我们相对更熟悉的应该是插入排序,选择排序,冒泡排序和快速排苏这四种排序算法。另外还有四中是对他们的优化算法,希尔排序是对选择排序的优化,堆排序是对选择排序的优化,还有两种就是归并排序和基数排序。

二.插入排序

原理:对于一个数组,我们取第一个数,依次加入第二个数,第三个数进行排序,直到最后一个数。加进来的数排序的过程就是要把它插入到一个有序的数列中,将它与有序数列最后一位开始往前比较找到一个比它更小或者相等的位置插入,这样加入的数也组成了一个新的有序数列,后面的数一样的道理。
过程:比如一个数组:
5,8,1,6,9,4,7,3
5,8,1,6,9,4,7,3(关注前两位,8插入进来)
1,5,8,6,9,4,7,3(关注前三位,1插入进来)
1,5,6,8,9,4,7,3(关注前四位,6插入进来)
1,5,6,8,9,4,7,3(关注前五位,9插入进来)
1,4,5,6,8,9,7,3(关注前六位,4插入进来)
1,4,5,6,7,8,9,3(关注前七位,7插入进来)
1,3,4,5,6,7,8,9(关注前八位,3插入进来)
代码:


    /**
     * 插入排序
     *
     * @param a
     */
    public static void insertSort(int[] a) {
        int len = a.length;
        for (int i = 1; i < len; i++) {
            int j = i;
            while (j >= 0 && a[i] < a[j]) {//a[i]是要插入进来的数更小则a[j]后移
                a[j + 1] = a[j];
                j--;
            }
            a[j + 1] = a[i];//要插入进来的数a[i]大于a[j],将a[i]值付给j+1位置
        }
    }

三.选择排序

原理:对于一个数组,遍历整个数组,将第二个数,第三个数直到最后一个数与第一个数比较得到最小的数和位置与第一个数替换,那么最小数就在第一位,以此类推,剩下的数最小数放到第二位,第三位...直到最后两位把更小的数放到倒数第二个位置完成排序。
过程:比如一个数组:
5,8,1,6,9,4,7,3
1,8,5,6,9,4,7,3(关注最小数1和第一位5替换了)
1,3,5,6,9,4,7,8(关注最小数3和第二位8替换了)
1,3,4,6,9,5,7,8(关注最小数4和第三位5替换了)
1,3,4,5,9,6,7,8(关注最小数5和第四位6替换了)
1,3,4,5,6,9,7,8(关注最小数6和第五位9替换了)
1,3,4,5,6,7,9,8(关注最小数7和第六位9替换了)
1,3,4,5,6,7,8,9(关注最小数8和第七位9替换了)
代码:

    /**
     * 选择排序
     *
     * @param a
     */
    public void selectSort(int[] a) {
        int len = a.length;
        for (int i = 0; i < len; i++) {//循环次数
            int value = a[i];
            int position = i;
            for (int j = i + 1; j < len; j++) {//找到最小的值和位置
                if (a[j] < value) {
                    value = a[j];
                    position = j;
                }
            }
            a[position] = a[i];//进行交换
            a[i] = value;
        }
    }

四.冒泡排序

原理:对于一个数组,遍历整个数组,两个两个比较,把更大的数往后挪,如果前一个数比后一个数大,直接进行替换,这样最大的数就会放在最后面,再以此类推,把第二大的数放到倒数第二个位置,直到将倒数第二大的数放大第二个位置排序就结束了。
过程:比如一个数组:
5,8,1,6,9,4,7,3
第一轮:
5,8,1,6,9,4,7,3
5,1,8,6,9,4,7,3(8和1比较替换)
5,1,6,8,9,4,7,3(8和6比较替换)
5,1,6,8,9,4,7,3(8和9比较不变)
5,1,6,8,4,9,7,3(9和4比较替换)
5,1,6,8,4,7,9,3(9和7比较替换)
5,1,6,8,4,7,3,9(9和3比较替换,第一轮结束,9到了最后面)
第二轮,同样的道理得到:
1,5,6,4,7,3,8,9(8也安排上了)
第三轮:
1,5,4,6,3,7,8,9(7也安排上了)
第四轮:
1,4,5,3,6,7,8,9(6也安排上了)
第五轮:
1,4,3,5,6,7,8,9(5也安排上了)
第六轮:
1,3,4,5,6,7,8,9(4也安排上了)
第七轮:
1,3,4,5,6,7,8,9(3也安排上了)
代码:

    /**
     * 冒泡排序
     * @param a
     */
    public void bubbleSort(int []a){
        int len=a.length;
        for(int i=0;i<len;i++){
            for(int j=0;j<len-i-1;j++){//注意最后面那些是已排好序的不需要在比较
                if(a[j]>a[j+1]){
                    int temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                }
            }
        }
    }

五.快速排序

原理:对于一个数组,选取第一个数作为参照值,设定两个下标作为向中间夹逼,一个low从1开始,一个high从最后一位也就是length-1开始,开始从high下标与参考值比较,如果比参考值大位置不变,high下标减一直到比参考值小则对调并且high下标减一方便下一次比较,此时用low下标与参考值比较,如果比参考值小位置不变,low值加一继续比较直到比参考值大则对调并且low下标加一方便下一次比较,此时再换到high下表比较,以此类推直到low和high夹逼相逢就会实现参考值左侧都是小于参考值,参考值的右侧都是大于参考值,然后分别对参考值的左侧和右侧使用同样方法夹逼排序。
过程:比如一个数组:
5,8,1,6,9,4,7,3
第一轮:
5,8,1,6,9,4,7,3
3,8,1,6,9,4,7,5(用3和5比较对调,使用high下标7)
3,5,1,6,9,4,7,8(用8和5比较对调,使用low下标1)
3,5,1,6,9,4,7,8(用7和5比较不变,使用high下标6)
3,4,1,6,9,5,7,8(用4和5比较对调,使用high下标5)
3,4,1,6,9,5,7,8(用1和5比较不变,使用low下标2)
3,4,1,5,9,6,7,8(用6和5比较对调,使用low下标3)
3,4,1,5,9,6,7,8(用9和5比较不变,使用high下标4,此时low和high相逢了,结束,观察5的两侧)
第二轮,以此类推:
1,3,4,5,8,6,7,9(观察3和9两侧)
第三轮:
1,3,4,5,7,6,8,9(观察8的两侧)
第四轮:
1,3,4,5,6,7,8,9(观察7的两侧)
代码:

    /**
     * 快速排序
     *
     * @param a
     * @param low
     * @param high
     */
    public static void quickSort(int[] a, int low, int high) {
        if (low < high) {
            int baseNum = a[low];//选基准值
            int midNum;//记录中间值
            int i = low;
            int j = high;
            do {
                while ((a[i] < baseNum) && i < high) {
                    i++;
                }
                while ((a[j] > baseNum) && j > low) {
                    j--;
                }
                if (i <= j) {
                    midNum = a[i];
                    a[i] = a[j];
                    a[j] = midNum;
                    i++;
                    j--;
                }
            } while (i <= j);
            if (low < j) {
                quickSort(a, low, j);
            }
            if (high > i) {
                quickSort(a, i, high);
            }
        }
    }

五.总结

以上就是关于Java常用的排序算法的相关知识点,如有不足或者错误的地方请在下方指正。

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

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,102评论 0 52
  • 转载自:https://egoistk.github.io/2016/09/10/Java%E6%8E%92%E5...
    chad_it阅读 947评论 0 18
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,179评论 0 2
  • 7种常用的排序算法总结 2016.04.30PoetryAlgorithm 排序算法:一种能将一串数据依照特定的排...
    raining_804f阅读 748评论 0 0
  • 黄公望(1269—1354),字子久,号大痴,一峰道人。本姓陆,名坚,因出继永嘉(今浙江温州)黄氏义子,遂改姓名。...
    大雨时行阅读 513评论 1 3