排序問題一直是計算機編程的重要問題。
而選擇排序、插入排序、冒泡排序都是多種排序算法中比較簡單、容易實現的排序算法,這幾種排序算法的平均事件複雜都是O(n2)
這裏用數組java int[] a = {10, 35, 97, 23, 66, 27, 19};
來進行講解。
實現思想一樣,但是實現代碼可能略有不同。
選擇排序
實現思想:
1,遍歷數組,選擇最小的元素放在第一個位置。
2,從第2個位置開始遍歷數組,從中將最小的元素放在第2個位置。
3,從第3個位置開始遍歷數組,從中將最小的元素放在第3個位置。
······
直到倒數第二個位置爲止,因爲最後一個位置不用排序,從前面的每次選擇中,剩下的最後一個位置一定是最大的元素。
例子
選擇排序
原順序:10 35 97 23 66 27 19
[]爲已經排好序的部分
第一步:[10] 35 97 23 66 27 19
第二步:[10 19] 97 35 66 27 23
第三步:[10 19 23] 97 66 35 27
第四步:[10 19 23 27] 97 66 35
第五步:[10 19 23 27 35] 97 66
第六步:[10 19 23 27 35 66] 97
無需第七步,數組已經變得有序了。
java實現代碼
static void selectSort(int[] a){
System.out.println("選擇排序");
for (int i = 0; i < a.length - 1; i++){
for (int j = i + 1; j < a.length; j++){
//總是將最小的數放在當前數組最前面的位置
if (a[i] > a[j]){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
插入排序
實現思想:
1,假設第1個元素是一個有序數組,然後將第2個元素插入到前面的數組中,
2,由於前面的那個數組是有序的,所以第2個與第1個元素進行比較,如果比第1個大的話就放在第2個位置,如果比第1個元素小的話就插入到第一個位置。
3,將第3個元素插入到含有兩個元素的前面的有序數組中合適的位置,要與第2個元素進行比較,如果大了就放在第3個位置,如果小於第2個元素,則要與第1個元素比較,從而找到合適的位置。
······
例子
選擇排序
原順序:10 35 97 23 66 27 19
[]爲已經排好序的部分
第一步:[10 35] 97 23 66 27 19
第一步:[10 35 97] 23 66 27 19
第一步:[10 23 35 97] 66 27 19
第一步:[10 23 35 66 97] 27 19
第一步:[10 23 27 35 66 97 ] 19
第一步:[10 19 23 27 35 66 97]
無需第七步,數組已經變得有序了。
java實現代碼
static void insertSort(int[] a){
System.out.println("插入排序");
for (int i = 1; i < a.length; i++){
for (int j = i-1; j > 0; j--){
if (a[j + 1] < a[j]){
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
}
冒泡排序
實現思想:
1,遍歷數組,選擇大的元素放在最後的位置。
2,遍歷數組,選擇第2大的元素放在倒數第2的位置。
3,遍歷數組,選擇第3大的元素放在倒數第3的位置。
······
例子
冒泡排序
原順序:10 35 97 23 66 27 19
[]爲已經排好序的部分
第一步:10 35 23 66 27 19 [97]
第二步:10 23 35 27 19 [66 97]
第三步:10 23 27 19 [35 66 97]
第四步:10 23 19 [27 35 66 97]
第五步:10 19 [23 27 35 66 97]
第六步:10 [19 23 27 35 66 97]
無需第七步,數組已經變得有序了。
java實現代碼
static void bubbleSort(int[] a){
System.out.println("冒泡排序");
for (int i = 0; i < a.length; i++){
for (int j = 0; j < a.length - i - 1; j++){
//總是將最大的數放在當前數組最後面的位置
if (a[j+1] < a[j]){
int t = a[j+1];
a[j+1] = a[j];
a[j] = t;
}
}
}
}