1. 程式人生 > >演算法總結(2)直接插入排序

演算法總結(2)直接插入排序

     ①直接插入排序

     一.思路

     每次迴圈都值對陣列的一部分進行排序。演算法從第二個位置開始,它總是假設在它之前的所有元素都是已經排好序的一群元素,在最開始,它只有一個元素,就是第一個元素。   後面的所有元素都依次往這個已經排好序的一群元素中插,使它還是一群排好序的元素。

     元素插入的過程:既然前面是已經排好序的了,所以這個插入的元素只需要儲存它的值,用這個值從最大的開始比較,如果最大數比它大,則把最大數往後移一位,接著按照減小的順序依次比較,如果比它大,則後移一位,直到遇見比它小的。

   二.虛擬碼

   insertsort(a[])

        for  i=1 to data.length-1

                  tmp=a[i];

                     將所有大於tmp的元素a[j]往後移一位;

                     將tmp的值放在正確的位置;

    三.java實現

/**
 * @author garypotter
 * @version 建立時間:2016年4月2日 下午1:54:32
 * @TODO
 * 類說明
 */
public class InsertSort {
	public static void main(String[] args) {
		Object[] a={5,2,3,8,1};
		insertsort(a);
		System.out.println("result:"+a[0]+a[1]+a[2]+a[3]+a[4]);
	}
	
	
	public static void insertsort(Object[] a){
		for(int i=1,j;i<a.length;i++){                  //注意,j定義在這裡,因為還需要內部的j來找到插入的位置,現在已經有i個已經排好
			Comparable tmp=(Comparable)a[i];
			for(j=i;j>0&&tmp.compareTo(a[j-1])<0;j--){  //現在已經有i個排列好的,從i-1,就是最後一個排列好的值,開始一個個比較,
				                                        //與tmp值比較,大者後移一位,遇見小的表示找到插入位置,插入,
				a[j]=a[j-1];                            //a[j-1]的值比tmp大,則將a[j-1]的值後移一位,放到a[j]中去
			}
			a[j]=tmp;                                   //j-1比tmp小,說明j就是該插入的位置,找到插入的位置了,把值放進去
		}
		
	}
	
	
	
	public static void swap(Object[] a,int m,int n){
		Object temp=a[m];
		a[m]=a[n];
		a[n]=temp;
	}


}


   

     四.分析

     觀察外部迴圈,總是迭代n-1次。

     最好情況:已經有序,比較一次就確定位置,總共需要比較(n-1)次,移動2(n-1)次。

     最壞情況:反序。對於第i次外部迴圈,內部都需要比較i次,所以總比較次數為1+2+.....+n=n(n-1)/2次。此時,移動次數是n(n-1)/2,再加上外部for迴圈載入和解除安裝tmp的次數,即2(n-1),即此時總共移動n(n-1)/2+2(n-1)次。

     比較次數依賴於它距離正確位置有多遠。