1、冒泡排序(Bubble Sort)O(n²)
/**
* 1.比較相鄰兩個數據如果。第一個比第二個大,就交換兩個數
*
* 2.對每一個相鄰的數做同樣1的工作,這樣從開始一隊到結尾一隊在最后的數就是最大的數。
*
* 3.針對所有元素上面的操作,除了最后一個。
*
* 4.重復1~3步驟,知道順序完成。
*/
//外圈從0到n-1
for(int i=0;i<arr.length-1;i++){
//內循環從1到n
for(int j=i+1;j<arr.length;j++){
//每次對比兩數,a>b交換,保持右邊大於左邊
if(arr[i]>arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
2.選擇排序(SelectSrot)O(n²)
/**
* 1.在一個長度為 N 的無序數組中,第一次遍歷 n-1 個數找到最小的和第一個數交換。
*
* 2.第二次從下一個數開始遍歷 n-2 個數,找到最小的數和第二個數交換。
*
* 3.重復以上操作直到第 n-1 次遍歷最小的數和第 n-1 個數交換,排序完成。
*/
for(int i = 0;i<arr.length-1;i++){
//記錄第一個數的索引
int min = i;
//從1開始判斷下個數時候小於最小數,若小於則最小索引置為此數
for(int j = i+1;j<arr.length;j++){
if(arr[j]<arr[min]){
min = j;
}
}
//將得到的最小數與第一個數交換
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
3.//快速排序(QuickSort)O (nlogn)
/**
* 二分思想
* 1.取數組第一個數arr[0]為基准數,記錄此值
* 2.從arr[1]向右判斷是否比基准數大,取第一個出現的數
* 從arr[arr.length-1]向左判斷是否比基准數小,取第一個出現的數
* 3.判斷2中兩個數的index,i是否大於j,若i<j則兩數交換
* 4.第一輪結束后,將基准數和重復1-3步驟操作
*/
private static void quickSort(int[] arr,int low,int high) {
if(low>high){
return;
}
int temp = arr[low];
int i = low;
int j = high;
while(i<j){
//!先從右向左判斷,找到一個比基准數小的數
while(temp<=arr[j]&&i<j){
j--;
}
//從左到右判斷,找到一個比基准數大的數
while(temp>=arr[i]&&i<j){
i++;
}
//判斷兩數索引大小
if(i<j){
int c = arr[i];
arr[i] = arr[j];
arr[j] = c;
}
}
//將基准數與排序后的左半段索引交換
arr[low] = arr[i];
arr[i] = temp;
//遞歸將左右兩段繼續排序
quickSort(arr, low, j-1);
quickSort(arr, j+1, arr.length-1);
}
排序速度:快速 > 選擇 > 冒泡