1. 程式人生 > >直接插入排序演算法詳解

直接插入排序演算法詳解

直接插入排序演算法到底是什麼個情況呢? 我們看到“直接”2個字,說明這個演算法應該是先得到我們插入的位置,然後就直接插入進去沒有什麼比較過程就插入進去了。

那麼直接插入排序演算法的本質是什麼呢,比如我們有一個有序陣列 1 2 3 4 5 6 8 9
我們想把一個8插入到當前陣列中,可以肯定我們必須找到我們插入的位置 我們這裡的位置是資料6的後面,這個6資料的索引5 因此我們的插入位置是索引為6

在日常生活中,經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。例如:一組從小到大排好順序的資料列{1,2,3,4,5,6,7,9,10},通常稱之為有序列,我們用序號1,2,3,…表示資料的位置,欲把一個新的資料8插入到上述序列中。

完成這個工作的步驟:

①確定資料”8”在原有序列中應該佔有的位置序號。資料”8”所處的位置應滿足小於或等於該位置右邊所有的資料,大於其左邊位置上所有的資料。

②將這個位置空出來,將資料”8”插進去。

直接插入排序(straight insertion sort)的做法是:

每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。

//插入排序演算法  iArray待排序的陣列    n陣列中的元素個數
void insertSort(int iArray[], int n)
{
      //我們第一個元素假如是有序的
      //我們通過迴圈遍歷得到除了第一個元素外的其他全部元素索引
//可以操作元素插入到指定的屬於他自己的位置 for(int i = 1; i < n; i++) { //定義臨時變數儲存我們需要插入的元素 int tempNeedInsert = i; //現在我們需要得到當前位置的前面的全部元素 for(int j = i - 1; j >= 0; j--) { //開始把當前i位置元素和他的前面元素進行一一對比找當前元素應該插入的位置 if(iArry[j] > iArray[i]) { //在找到了比當前待插元素更大的元素我們就把大的元素後移一位
iArray[j + 1] = iArray[j]; }else { //說明當前待排序的元素已經大於他的前面的這個元素 //說明我們已經找到我們插入元素的位置了 //那我們就沒必要在迴圈尋找了 break; } } //當前這個迴圈完畢的話說明我們已經找到待插入元素的索引了 //準備插入我們的元素 iArray[j + 1] = iArray[i]; } } int main() { int iArray[5] = { 5,4,3,2,1 }; insertion_sort(iArray, 5); for (int i = 0; i < 5; i++) { std::cout << iArray[i] << std::endl; } return 0; }