好長時間沒有寫了,今天來複習一下插入排序。
插入排序。算法的大致思想和字面意思差不多,就是將無序的數組中插入到有序的數組中,當無序的數組爲空時,排序就完成了。以上就是算法的大概思路,下面詳細說一下。插入排序將要排序的數組分爲兩個“數組”,左邊的數組爲有序的數組,右邊的爲無序的數組。(兩者相反也可)將右邊數組的元素依次放入左邊數組中的有序位置,等到右邊數組的元素放完後,整個排序也就完成了。
下面再來說一說算法的具體細節。在算法的實現過程中,不可能直接將原數組分爲兩個數組,這樣不僅會浪費時間,而且也會浪費機器的性能(開闢新的數組所需要的空間)。所以這裏可以用指針來標記和分別兩個數組。算法的大體由兩個for循環構成,第一個是將無序的數組中的元素放入有序的數組中,第二個是將放入的元素放到有序數組中的合適位置。算法的大致思路也是容易想到的,一些細節問題都註釋在代碼中了。下面就是代碼。
public class demo {
public static void sort(Comparable[] a) {
// 插入排序
// 用一個數組完成插入排序的算法,將a數組中前面和後面分成兩個部分
int N = a.length;
// 這裏不用考慮a[i]數組中只有一個元素的情況,所以直接從1開始。
for (int i = 1; i < N; i++)// 爲什麼要從1開始,因爲插入要有一個數組,那個一就是開始的數組
{
// 建立數組a[i],再用j循環找出j再a[i]中的數組位置
for (int j = i; j > 0 && less(a[j], a[j - 1]); j--)// 比較位置,交換相鄰的兩個數字。不是嚴格意義上的插入排序
exch(a, j, j - 1);
}
}
private static boolean less(Comparable v, Comparable w) {
// 比較用來排序的兩個參數。根據第一個參數小於、等於或大於第二個參數分別返回負整數、零或正整數。
// 如果v大於w,返回false
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j) {
// 交換位置
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void main(String args[]) {
// 1 2 4 6 7 7 8 23 55 56 90
Comparable[] a = {1,4,2,6,7,55,8,23,7,90,56};
sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
以上就是代碼的實現,現在講一講算法實現我的一些想法。這個算法用了兩個for循環,但是會發現第二個for循環內部做的事情有點多,因爲每一次的比較都要交換當前元素和前一個元素的位置,直到找到合適的位置。所以第二個for循環內部可以改爲while循環,將數組改爲鏈表,這樣就可以達到插入的目的。
上面看完後,會發現插入排序的特點,因爲將數組分爲了兩個數組,所以插入排序對於那些已經大部分有序的數組排序起來要比選擇排序要快的多。所以,對於排序算法的選擇要根據問題而定。結束。