算法學習——插入排序

插入排序的實現方式是用一層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²).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章