假設我們現在有一個數組,對它進行排序,插入排序的算法如同它的名字一樣,就是將元素一個一個插入到合適的位置,那么,該如何做呢??
如果我們要從小到大進行排序的話,步驟如下:
1.對于第一個數來說,一個數無法考慮順序問題,所以要從第二個數開始進行插入,進行排序。
2.排序的思想是:從頭開始遍歷,如果該數小于一個數,那么該數就插入到較大數的前面。
如圖:
我們現在讓 i 充當要插入的數,j 表示遍歷插入的數要比較的數,此時 i 指向的數大于 j 指向的數,所以位置不發生改變。
接著 i ++這時 i 指向的數值為1,小于 j 指向的數值,所以要將1插入到7的前面。說是插入,其實是先讓7 8 向后覆蓋,然后把1放到最開始7 的位置,循環覆蓋的范圍是j到i。
覆蓋過程如下:?
完成插入操作之后,i 接著加加,接著讓 j 從0 開始遍歷比較,當j等于1的時候,要插入的元素小于遍歷的元素,此時在完成插入操作,循環覆蓋的范圍是j到i。
接下來我們就可以開始寫代碼了,我們可以先寫出類似于這樣的代碼:
void InsertSort(int* array, int size) {for (int i = 1; i < size; i++) {———— i表示要插入的數 for (int j = 0; j < i; j++) {———— j表示要比較的數(插入的數之前的)取得要插入的數 numif (array[j] > 要插入的數) {將數插入到array[j]之前}}}
}
接著補全代碼:
void InsertSort(int* array, int size) {for (int i = 1; i < size; i++) {for (int j = 0; j < i; j++) {int num = array[i];if (array[j] > num) {for (int k = i; k > j; k--) {array[k] = array[k-1];}array[j] = num;}}}
}
????????或者我們可以換一種方式,剛才的代碼是從頭開始進行比較,我們也可以從后向前進行比較,如果遇到比插入的數大的值就接著向前進行尋找,同時進行覆蓋,如果遇到比插入的數小的值就跳出循環,最后實現調換位置。
代碼如下:
void InsertSort(int *array,int size) {for (int i = 0; i < size - 1; i++) {(因為要排序size-1次,所以循環size-1次)int end = i;int tmp = array[end + 1];while (end >= 0){ if (tmp < array[end]) {(如果要插入的值比array[end]值小,第一次循環是前一個值,第二次循環是前兩個值)array[end + 1] = array[end];(向后覆蓋數值,相當于后移比插入值大的數)end--;(向前繼續尋找)}else {break;}}array[end + 1] = tmp;(循環結束,把插入值插入到正確的位置,即比自己小的數的后面)}
}
這兩種方式都可以完成對數的插入排序。
這就是文章的全部內容了,希望對你有所幫助,如有錯誤歡迎指出。