插入排序中有兩種算法,一種是直接插入法,一種是希爾排序,希爾排序則是藉助直接插入排序的原理進行排序,相較之直接插入排序在時間複雜度和空間複雜度上較低
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]);
}
}
}