一、氣泡排序
氣泡排序相對於最簡單的排序有了改進,即每次交換都是對後續有幫助的,大數將會越來越大,小的數將會越來越小;
氣泡排序思想:兩兩相鄰元素之間的比較,
如果前者大於後者,則交換;
因此此排序屬於交換排序一類,同類的還有現在最常用的排序方法:快速排序;
1.標準氣泡排序
此種方法是最一般的氣泡排序實現,思想就是兩兩相鄰比較並交換;
演算法實現如下:
1. public static int bubble_sort2(int arr)
7. }
8. }
9. return arr;
10. }
public static int bubble_sort2(int arr) }
}return arr; }
2.改進氣泡排序
改進在於如果出現乙個序列,此序列基本是排好序的,如果是標準的氣泡排序,則還是需要進行不斷的比較;
改進方法:通過乙個boolean ischanged
,如果一次迴圈中沒有交換過元素,則說明已經排好序;
演算法實現如下:
1. // 最好:
n-1次比較,不移動
,因此時間複雜度為
o(n)
,不占用輔助空間
2. // 最壞:
n(n-1)/2
次比較和移動,因此
o(n^2)
,占用交換的臨時空間,大小為1;
3. public static int bubble_sort3(int arr)
12. }
13. }
14. return arr;
15. }
// 最好:n-1次比較,不移動,因此時間複雜度為o(n),不占用輔助空間
// 最壞:n(n-1)/2次比較和移動,因此o(n^2),占用交換的臨時空間,大小為1;
public static int bubble_sort3(int arr) }
}return arr; }
二、簡單選擇排序
簡單選擇排序特點:每次迴圈找到最小值,並交換,因此交換次數始終為n-1
次;相對於最簡單的排序,對於很多不必要的交換做了改進,每個迴圈不斷比較後記錄最小值,只做了一次交換(當然也可能不交換,當最小值已經在正確位置)
演算法如下:
1. //最差:
n(n-1)/2
次比較,
n-1次交換,因此時間複雜度為
o(n^2)
2. //最好:
n(n-1)/2
次比較,不交換,因此時間複雜度為
o(n^2)
3. //好於氣泡排序
4. public static int selection_sort(int arr)
11. }
12. if (min != i)
13. swap(arr, min, i);
14. }
15. return arr;
16. }
//最差:n(n-1)/2次比較,n-1次交換,因此時間複雜度為o(n^2)
//最好:n(n-1)/2次比較,不交換,因此時間複雜度為o(n^2)
//好於氣泡排序
public static int selection_sort(int arr) }
if (min != i)
swap(arr, min, i); }
return arr; }
三、簡單插入排序
思想:
給定序列,存在乙個分界線,分界線的左邊被認為是有序的,分界線的右邊還沒被排序,每次取沒被排序的最左邊乙個和已排序的做比較,並插入到正確位置;我們預設索引
0的子陣列有序;每次迴圈將分界線右邊的乙個元素插入有序陣列中,並將分界線向右移一位;
演算法如下:
1. // 最好
:n-1
次比較,
0次移動
,時間複雜度為
o(n)
2. // 最差
:(n+2)(n-1)/2
次比較,
(n+4)(n-1)/2
次移動,時間複雜度為
o(n^2)
3. public static int insertion_sort(int arr)
11. arr[j + 1] = tmp;
12. }
13. }
14. return arr;
15. }
// 最好:n-1次比較,0次移動 ,時間複雜度為o(n)
// 最差:(n+2)(n-1)/2次比較,(n+4)(n-1)/2次移動,時間複雜度為 o(n^2)
public static int insertion_sort(int arr)
arr[j + 1] = tmp; }
}return arr; }
簡單插入排序比選擇排序和氣泡排序好!
四、希爾排序
2023年
shell
發明;第乙個突破o(n^2)
的排序演算法;是簡單插入排序的改進版;
思想:由於簡單插入排序對於記錄較少或基本有序時很有效,因此我們可以通過將序列進行分組排序使得每組容量變小,再進行分組排序,然後進行一次簡單插入排序即可;
這裡的分組是跳躍分組,即第1,4,7
位置為一組,第2,
5,8位置為一組,第3,
6,9位置為一組; 索引
1 23 4
5 67 8
9 此時,如果increment=3
,則i%3
相等的索引為一組,比如索引1,
1+3,
1+3*2
一般增量公式為:increment = increment/3+1;
演算法實現如下:
1. // o(n^(3/2))
2. //不穩定排序演算法
3. public static int shell_sort(int arr)
14. arr[j + increment] = tmp;
15. }
16. }
17. } while (increment > 1);
18. return arr; }
排序 排序演算法整理
經常零零散散的用到排序演算法,將幾類常見的總結下來 時間複雜度o n 2 空間複雜度o 1 穩定排序 param arr public static void insersort int arr else arr j 1 tmp 氣泡排序 時間複雜度 o n 2 空間複雜度o 1 穩定排序 para...
排序演算法整理
template void cinsertsort mysort function compare template void cselectsort mysort function compare swap datas i datas id void cshellsort mysort funct...
排序演算法整理
先把常用排序演算法進行分類 插入排序 直接插入排序 折半插入排序 希爾排序 交換排序 氣泡排序 快速排序 選擇排序 簡單選擇排序 堆排序 歸併排序 基數排序 下面我們乙個乙個來看 1.直接插入排序 進行n 1趟排序,每趟把乙個元素插入到前面已經排好序的序列中,其時間複雜度為o n 並且由於判斷要插入...