插入排序的實現方式是用一層for循環裏套一層while循環,和選擇排序有點不同,但是既然是排序,就離不開比較,經過比較之後纔會有順序,所以插入排序也是通過選擇元素之後再進行比較之後實現的。
假設要爲數組a進行排序,插入排序的思想是直接以數組前兩個元素爲標準向後擴展,第一次擴展之前以及每次擴展後都會進行一次向前比較,for循環從a[1]開始,一次for循環擴展一位,第一次比較的就是a[0]和a[1],臨時變量temp所替代的元素爲a[1],從a[1]向a[0]比較,如果a[1]小於a[0],則將a[1]插到a[0]的前面,因此叫做插入排序,經過一次擴展後,temp代替a[2],由a[2]向前比較,以此類推,當for循環遍歷結束後,排序完成。
簡單排序流程如下:
int[] a = {32,12,21,43,65};
第一趟排序後:[12,32],21,43,65
第二趟排序後:[12,21,32],43,65
第三趟排序後:[12,21,32,43],65
第四趟排序後:[12,21,32,43,65]
代碼實現及測試結果如下:
package pp.suanfa;
/**
*
* 插入排序
*
* @author Administrator
*
*/
public class InsertSort {
public static void iSort(int[] a)
{
if(a!=null)
{
for(int i=1;i<a.length;i++)
{
int temp = a[i],j=i;//取出a[i]和i的值
if(a[j-1]>temp)//當前面的數比後面的數大時
{
while(j>=1&&a[j-1]>temp)//向前遍歷將大數換到後面
{
a[j] = a[j-1];
j--;
}
}
a[j] = temp;//將小數換到前面
}
}
}
public static void main(String[] args){
int[] a = {32,21,16,54,35};
iSort(a);
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
System.out.println();
}
}
其實代碼中的int temp = a[i];a[j]=a[j-1];a[j]=temp;就是簡單的位置互換(要注意第三句裏的j已經是執行完自減操作的,相當於i-1),不過這裏不是兩兩比較,而是讓第i個元素同其前面的i-1個元素比較,最後進行位置互換,所以將第三句放在了第二層循環外,第一層循環內。
如果運氣好的話,a[j-1]一直小於temp,則無需進入第二層循環,此時時間複雜度就爲O(n),反之每次都要進入第二層while循環,此時的時間複雜度就爲O(n²).