插入排序算法中的直接插入法和希爾排序

插入排序中有兩種算法,一種是直接插入法,一種是希爾排序,希爾排序則是藉助直接插入排序的原理進行排序,相較之直接插入排序在時間複雜度和空間複雜度上較低

1直接插入排序的原理:
在一組要排序的數中,假設前面n-1都是有序的,將第n個數與前面n-1個數進行比較,如果前面的數大於第n個數,就將第n-1位置上的數向後移動一位,再將第n個數繼續與前面的數進行比較,如果前面的數小於第n個數的值,就將第n個數插入到空的位置上來

package www.wwg.cn;

/**
 * 直接插入排序
 * @author Administrator
 *
 */
public class InsertSort1 {

	public static void main(String args[]){
		int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5};
		
		for(int i=1;i<a.length;i++){           //設第一個進行比較的位置爲1
			int temp=a[i];                 //將i=1的值賦給一個變量
			int j=i-1;                     //j爲要排序參數前面的參數
			for(;temp<a[j]&&j>0;j--){      //當第i位的數小於前面i-1位的數且前面的位置不爲0.就進行循環比較
				a[j+1]=a[j];           //把第i-1位置的數賦給i位置上去
			}
			a[j+1]=a[j];                    
		}
	}
}

2希爾排序

原理:將相距爲d(n/2)的元素爲一組進行比較,比較的方式採用直接插入排序,排序完畢將d變爲相距爲d/2的數爲一組進行排序,以此類推,當d=1時就是兩組有序數列進行比較,當對d=2時,進入滿足條件的while語句時d=1,就是進行d=1的比較

/**
 * 希爾排序
 * @author Administrator
 *
 */
public class ShellSort {

	public static void main(String[] args){
		int[] a={2,3,6,23,65,2,7,3,9,34};
		int d=a.length;           //先算出數組的長度
		while(d>1){               //進入循環語句中,臨界條件是d要大於1
			d=d/2;                 
			for(int x=0;x<d;x++){    //總共有多少組數列進行比較
                               //與直接插入排序原理相同				
				for(int i=x+d;i<a.length;i+=d){     
					int temp=a[i];
					int j=i-d;
					for(;j>=0&&temp<a[j];j-=d){
						a[j+d]=a[j];
					}
					a[j+d]=temp;
				}
			}
			
		}
		for(int i=0;i<a.length;i++){
			System.out.println(a[i]);
		}
	}
}



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