Java排序理解增強版
阿新 • • 發佈:2018-11-13
前言:幹了好多年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);
}
}
}
複製程式碼
參考地址:腳丫先生