排序算法

排序算法

排序算法思維導(dǎo)圖

直接插入排序

基本思想

在要排序的一組數(shù)中魁袜,假設(shè)前面(n-1) [n>=2]個數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個數(shù)插到前面的有序數(shù)中,使得這n個數(shù)也是排好順序的座咆。如此反復(fù)循環(huán),直到全部排好順序仓洼。

特點

  1. 穩(wěn)定性: 穩(wěn)定

  2. 平均時間復(fù)雜度: O(n^2)

  3. 空間復(fù)雜度: O(1)

實例

代碼

 public static void insetSort(int[] arr) {
        int len = arr.length;
        //默認第一個元素有序介陶,從第二個元素開始比較
        for (int j = 1; j < len; j++) {
            int temp = arr[j];
            int i = j - 1;
            //依次比較找到插入位置
            while (i >= 0 && arr[i] > temp) {
                arr[i + 1] = arr[i];
                i--;
            }
            arr[i+1] = temp;
        }
    }

Shell排序

基本思想

先將要排序的一組數(shù)按某個增量d(n/2,n為要排序數(shù)的個數(shù))分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序色建,然后再用一個較小的增量(d/2)對它進行分組哺呜,在每組中再進行直接插入排序。當增量減到1時箕戳,進行直接插入排序后某残,排序完成。

特點

  1. 穩(wěn)定性: 不穩(wěn)定

  2. 平均時間復(fù)雜度: O(n^1.3)

  3. 空間復(fù)雜度: O(1)

實例

代碼

public static void shellSort(int[] arr) {
        int length = arr.length;
        int increment = length;
        while (true) {
            //增量
            increment = increment / 2;
            //分組處理
            for (int i = 0; i < increment; i++) {
                //按照直接插入算法處理
                for (int j = i+increment; j + increment < length; j += increment) {
                    int temp = arr[j];
                    int K = j - increment;
                    while (K >= 0 && arr[K] > temp) {
                        arr[K + increment] = arr[K];
                        K-=increment;
                    }
                    arr[K+increment] = temp;
                }
            }
            //增量為1是退出
            if (increment == 1) {
                break;
            }
        }
    }

簡單選擇排序

基本思想

基本思想:在要排序的一組數(shù)中陵吸,選出最小的一個數(shù)與第一個位置的數(shù)交換玻墅;然后在剩下的數(shù)當中再找最小的與第二個位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個數(shù)和最后一個數(shù)比較為止壮虫。

特點

  1. 穩(wěn)定性: 不穩(wěn)定

  2. 平均時間復(fù)雜度: O(n^2)

  3. 空間復(fù)雜度: O(1)

實例

代碼

 public static void selectSort(int[] arr) {
        int len = arr.length;
        int index = 0;
        for (int i = 0; i < len; i++) {
            int temp = arr[i];
            //查找最大值
            for (int j = i + 1; j < len; j++) {
                if (temp < arr[j]) {
                    temp = arr[j];
                    index = j;
                }
            }
            //交換位置
            if (arr[i] != temp) {
                SortUtils.swap(arr, i, index);
            }
        }
    }

冒泡排序

基本思想

在要排序的一組數(shù)中澳厢,對當前還未排好序的范圍內(nèi)的全部數(shù),自上而下對相鄰的兩個數(shù)依次進行比較和調(diào)整,讓較大的數(shù)往下沉剩拢,較小的往上冒线得。即:每當兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時,就將它們互換裸扶。

特點

  1. 穩(wěn)定性: 穩(wěn)定

  2. 平均時間復(fù)雜度: O(n^2)

  3. 空間復(fù)雜度: O(1)

實例

代碼

  public static void bubbleSort(int[] arr) {
        int len = arr.length;
        for (int i = 0; i < len ; i++) {
            for (int j = 0; j < len - i - 1; j++) {
                if (arr[j] < arr[j + 1]) {
                    SortUtils.swap(arr, j, j + 1);
                }
            }
        }

    }

快速排序

基本思想

選擇一個基準元素,通常選擇第一個元素或者最后一個元素,通過一趟掃描框都,將待排序列分成兩部分,一部分比基準元素小,一部分大于等于基準元素,此時基準元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。

特點

  1. 穩(wěn)定性: 不穩(wěn)定

  2. 平均時間復(fù)雜度: O(nlgn)

  3. 空間復(fù)雜度: O(nlgn)

實例

代碼

 public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int middle = getMiddle(arr, low, high);  //將list數(shù)組進行一分為二
            quickSort(arr, low, middle - 1);        //對低字表進行遞歸排序
            quickSort(arr, middle + 1, high);       //對高字表進行遞歸排序
        }
    }

    public static int getMiddle(int[] arr, int low, int high) {
        int tmp = arr[low];    //數(shù)組的第一個作為中軸  
        while (low < high) {
            while (low < high && arr[high] > tmp) {
                high--;
            }
            arr[low] = arr[high];  //比中軸小的記錄移到低端
            while (low < high && arr[low] < tmp) {
                low++;
            }
            arr[high] = arr[low];  //比中軸大的記錄移到高端
        }
        arr[low] = tmp;  //中軸記錄到尾
        return low;   //返回中軸的位置
    }

歸并排序

基本思想

歸并排序法是將兩個(或兩個以上)有序表合并成一個新的有序表呵晨,即把待排序序列分為若干個子序列魏保,每個子序列是有序的。然后再把有序子序列合并為整體有序序列摸屠。

特點

  1. 穩(wěn)定性: 穩(wěn)定

  2. 平均時間復(fù)雜度: O(nlgn)

  3. 空間復(fù)雜度: O(n)

實例

代碼

     //遞歸劃分
    public static void mergeSort(int[] data, int left, int right) {
            if(left<right){
                //找出中間索引
                int center=(left+right)/2;
                //對左邊數(shù)組進行遞歸
                mergeSort(data,left,center);
                //對右邊數(shù)組進行遞歸
                mergeSort(data,center+1,right);
                //合并
                merge(data,left,center,right);
            }
    }
    //合并有序數(shù)組
    public static void merge(int[] data, int left, int center, int right) {
        int [] tmpArr=new int[data.length];
        int mid=center+1;
        //third記錄中間數(shù)組的索引
        int third=left;
        int tmp=left;
        while(left<=center&&mid<=right){
            //從兩個數(shù)組中取出最小的放入中間數(shù)組
            if(data[left]<=data[mid]){
                tmpArr[third++]=data[left++];
            }else{
                tmpArr[third++]=data[mid++];
            }
        }
        //剩余部分依次放入中間數(shù)組
        while(mid<=right){
            tmpArr[third++]=data[mid++];
        }
        while(left<=center){
            tmpArr[third++]=data[left++];
        }
        //將中間數(shù)組中的內(nèi)容復(fù)制回原數(shù)組
        while(tmp<=right){
            data[tmp]=tmpArr[tmp++];
        }
        System.out.println(Arrays.toString(data));
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谓罗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子季二,更是在濱河造成了極大的恐慌檩咱,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胯舷,死亡現(xiàn)場離奇詭異刻蚯,居然都是意外死亡,警方通過查閱死者的電腦和手機桑嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門炊汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逃顶,你說我怎么就攤上這事讨便。” “怎么了以政?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵霸褒,是天一觀的道長。 經(jīng)常有香客問我盈蛮,道長废菱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任抖誉,我火速辦了婚禮殊轴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寸五。我一直安慰自己梳凛,他們只是感情好耿币,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布梳杏。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪十性。 梳的紋絲不亂的頭發(fā)上叛溢,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音劲适,去河邊找鬼楷掉。 笑死,一個胖子當著我的面吹牛霞势,可吹牛的內(nèi)容都是我干的烹植。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼愕贡,長吁一口氣:“原來是場噩夢啊……” “哼草雕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起固以,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤墩虹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后憨琳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诫钓,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年篙螟,在試婚紗的時候發(fā)現(xiàn)自己被綠了菌湃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡闲擦,死狀恐怖慢味,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墅冷,我是刑警寧澤纯路,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站寞忿,受9級特大地震影響驰唬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腔彰,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一叫编、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霹抛,春花似錦搓逾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽世蔗。三九已至,卻和暖如春朗兵,著一層夾襖步出監(jiān)牢的瞬間污淋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工余掖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寸爆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓盐欺,卻偏偏與公主長得像赁豆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冗美,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序歌憨,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大墩衙,一次不能容納全部...
    蟻前閱讀 5,191評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序务嫡,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大漆改,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評論 0 15
  • 概述排序有內(nèi)部排序和外部排序心铃,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大挫剑,一次不能容納全部的...
    Luc_閱讀 2,278評論 0 35
  • 總結(jié)一下常見的排序算法去扣。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序樊破。外排序:指在排序...
    jiangliang閱讀 1,350評論 0 1
  • 世貿(mào):洪昌先生(五) 山田耕夫 斜風(fēng)細雨不思歸 歸車世貿(mào) 洪昌先生 今朝是何年 一片春好風(fēng)和 蒼天下 黃土...
    興安居士閱讀 110評論 1 3