------------恢復內容開始------------算法
直接插入排序算法從根本上講就兩步,第一步:將一個數組長度爲n的數組的前i(i<n)個元素做爲一個有序列,一共就有n-1個有序列。第二步:將第i+1個元素插入到這個有序列當中,比插入元素大的通通右移一位從而構成第n+1個有序列。數組
圖示:測試
數組: | {22} | 31 | 24 | 35 | 76 | 27 | 68 | 19 | 11 |
第一步: | {22 | 31} | 24 | ||||||
第二步: | {22 | 24 | 31} | 35 | |||||
第三步: | {22 | 24 | 31 | 35} | 76 | ||||
第四步: | {22 | 24 | 31 | 35 | 76} | 27 | |||
第五步: | {22 | 24 | 27 | 31 | 35 | 76} | 68 | ||
第六步: | {22 | 24 | 27 | 31 | 35 | 68 | 76} | 19 | |
第七步: | {19 | 22 | 24 | 27 | 31 | 35 | 68 | 76} | 11 |
第八步: | {11 | 19 | 22 | 24 | 27 | 31 | 35 | 68 | 76 |
算法代碼:spa
1 public class straightInsertSort { 2 public void StraightInsertSort ( int data[], int a){ //a爲數組長度 3 for (int i = 1; i < a; i++) { //第一步將數組分爲n-1個有序列 4 if (data[i] < data[i - 1]) { //若是索引爲i的元素 比 有序列最大的元素即索引爲i-1的元素大就沒必要進行插入 5 int temp=data[i]; //儲存要插入的元素 6 int j; //定義第一個循環裏面的全局變量j 7 for (j = i - 1; j >= 0 && temp< data[j]; j--) { //找到插入點 8 data[j + 1] = data[j]; //這一步後的j會減一而後跳出循環,此時的j即爲插入點,所以下一步的插入點爲j加一 9 } 10 data[j + 1] = temp; //以前定義全局變量j就是爲了插入點的賦值,以前儲存插入元素是由於以前的大的元素右移已經把插入元素的位置給佔了,假如不提早取出來那麼這個插入元素就會不見被這個有序列最大的元素替代 11 } 12 } 13 } 14 }
測試代碼:code
1 public class straightInsertSortDemo { 2 public static void main(String[] args) { 3 int data[] = { 22, 31, 24, 35, 76, 27, 68, 19,11}; 4 straightInsertSort sis=new straightInsertSort(); 5 sis.StraightInsertSort(data,data.length); 6 for(int i=0;i<data.length;i++) { 7 System.out.print(data[i]+" "); 8 } 9 } 10 }
結果:blog
1 11 19 22 24 27 31 35 68 76 2 Process finished with exit code 0
------------恢復內容結束------------排序