Java排序理解增強版

少林寺三毛發表於2018-11-12

前言:幹了好多年java,由於平時乾的都是搬磚工,平時也接觸不好燒磚的技術活,所以不曉得磚怎麼燒製,白乾了這麼多年!

氣泡排序:

氣泡排序就是將兩兩相鄰的記錄關鍵字進行比較,反序則調換值,直至到沒有反序出現。 從大神哪裡盜了幾張圖片,容易理解:

排序前

Java排序理解增強版

排序中

Java排序理解增強版

排序後

Java排序理解增強版

廢話不說上程式碼(直到為什麼沒是圖片嗎?我怕我下次copy):

Java排序理解增強版

總結:由於氣泡排序每相鄰的兩個引數就要比較,所以效能很一般,平均時間複雜度為O(N2),所以不建議使用。可使用快速排序代替! 參考地址:孔乙己學習成長錄

快速排序

快速排序是指的選取一個基準值X,然後先從右往左尋找小於X的第一個值,再從左至右尋找大於X的第一個值,將兩個值交換位置,持續這樣迴圈,直至左右移動到同一個位置,基準值和此位置交換,此時交換得到了兩個序列,基準值左邊為小於基準值的值,基準值右邊為大於基準值的值,然後採用所謂的二分法進行分別排序(還是上面的方法:交換資料)。 繼續copy生動的圖片來演示:

i和j兩位帥哥開始站位在左右兩邊

Java排序理解增強版

基準為6,左找大於等於6的值,右找小於等於6的值

Java排序理解增強版

交換後

Java排序理解增強版

不離不棄繼續找並且交換

Java排序理解增強版

找完了,幸福的走到了一起

Java排序理解增強版

把基準值和最後位置互換

Java排序理解增強版

得到了排序的第一版

Java排序理解增強版

可以看出6左邊都小於等於它,右邊都大於等於他,現在分為兩個無序序列,分別按照上面的流程排序,得到最總有序陣列。

ps:快速排序是對氣泡排序的優化,因為快速排序是兩兩交換的距離增大,交換次數少,所以效率提升很多,最差時間複雜度=冒泡時間複雜度,一般時間複雜度為:O(NLOGN),並且用到了二分思想

一樣的,上程式碼,自己寫哦

package com.zwj.java;

/**
 *@author 少林寺三毛
 * 快速排序 找到一個基準值X(一般是獲取陣列第一個數字),通過和右邊比較X,找到比X小則停住,然後做邊進行比較X,如果找到大於X則停住,
 * 交換兩個資料位置,往而復失,直到X左邊小於X,X右邊值大於X,在採用此方法對做面方法進行排序,然後對右邊開始排序,得到最終結果
 */
public class QuickSort {

    /**
     * 快速排序實現
     * @param numbers 待排序的陣列
     * @param start 基準值索引值,一般是第一個
     * @param end 右邊最後一個值的索引值
     */
    public static void quick(Integer[] numbers, int start, int end){
        int i,j,t,temp;
        if (start > end){
            return;
        }
        i = start;
        j = end;
        temp = numbers[i];
        while (i < j){
            //先看右邊,找到小於等於temp基準值後停留
            while (temp <= numbers[j] && i < j){
                j--;
            }
            while (temp >= numbers[i] && i < j){
                i++;
            }
            if (i < j){
                t = numbers[i];
                numbers[i] = numbers[j];
                numbers[j] = t;
            }
            //當i與j相等時,則基準值temp與x、y相等下標的值相互交換
            numbers[start] = numbers[i];
            numbers[i] = temp;
            //遞迴呼叫左邊半資料
            quick(numbers,start,j - 1);
            //遞迴呼叫右邊半資料
            quick(numbers,j + 1,end);
        }
    }

    public static void main(String[] args) {
        Integer[] numbers = {10,6,7,1,6,3,2,1,8,5,4};
        quick(numbers,0,numbers.length-1);
        for (Integer i : numbers){
            System.out.println(i);
        }
    }
}

複製程式碼

參考地址:腳丫先生

選擇排序

選擇排序基本思路是多趟到待排序的記錄序列中獲取到最小值,放在已排序表的最前面,直至全部排完。這裡的關鍵問題在於怎麼獲取待排序中的最小值。

1、簡單選擇排序

簡單選擇排序就是說在一組待排序序列中,找到最小值與第一個交換,在餘下的待排序的序列中查詢最小值與第二個值交換,直至倒數第二個與最後一個交換為止。找個一個簡單圖,易於瞭解

Java排序理解增強版

上程式碼(不得不說和冒泡、快速排序很像,缺點是不穩定):

/**
     *選擇排序之簡單排序
     */
    public static void simpleChooseSort(Integer[] numbers){
        for (int i = 0; i < numbers.length; i++){
            int minNum = numbers[i];
            int n = i;
            for (int j = i + 1; j < numbers.length; j++){
                if (minNum > numbers[j]){
                    minNum = numbers[j];
                    n++;
                }
            }
            numbers[n] = numbers[i];
            numbers[i] = minNum;
        }
    }

    public static void main(String[] args) {
        Integer[] numbers = {3,2,5,1,63,2,6,21,6,78,9,1,5};
        simpleChooseSort(numbers);
        System.out.println(numbers);
    }
複製程式碼

2、堆排序

對結構就是一種樹形選擇排序,是對簡單選擇排序的有效改進。

瞌睡了,等待。。。

相關文章