前言:幹了好多年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);
}
}
}
複製程式碼
參考地址:腳丫先生
選擇排序
選擇排序基本思路是多趟到待排序的記錄序列中獲取到最小值,放在已排序表的最前面,直至全部排完。這裡的關鍵問題在於怎麼獲取待排序中的最小值。
1、簡單選擇排序
簡單選擇排序就是說在一組待排序序列中,找到最小值與第一個交換,在餘下的待排序的序列中查詢最小值與第二個值交換,直至倒數第二個與最後一個交換為止。找個一個簡單圖,易於瞭解
上程式碼(不得不說和冒泡、快速排序很像,缺點是不穩定):
/**
*選擇排序之簡單排序
*/
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、堆排序
對結構就是一種樹形選擇排序,是對簡單選擇排序的有效改進。
瞌睡了,等待。。。