1. 程式人生 > >Java排序理解增強版

Java排序理解增強版

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

氣泡排序:

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

排序前

排序中

排序後

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

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

快速排序

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

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

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

交換後

不離不棄繼續找並且交換

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

把基準值和最後位置互換

得到了排序的第一版

可以看出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); } } } 複製程式碼

參考地址:腳丫先生