直接插入排序 監視哨的作用

2021-08-14 09:50:54 字數 2509 閱讀 1015

從前往後依次將每乙個元素插入到前面已排好的序列中,如當插入到arr[i]時,arr[0]至arr[i-1]已排好序了,將arr[i]與arr[0],arr[2],arr[2],…arr[i-1]依次比較,直到找到正確的插入位置,當把最後乙個元素插入完成時,排序結束。

現在我們有這樣乙個序列:

我們可以將它拆開成兩部分,arr[0]是已排好序的,之後全部是未排序的:

首先從arr[1]開始(i=1時),我們將arr[1]插入到前面已排好的序列arr[0]arr[0]中(即arr[0]arr[i-1]),讓arr[1]依次與已排好的序列中每個元素比較,找比6大的元素,沒找到,插入到末尾。

然後接著下乙個,當i=2時,將arr[2]插入到前面已排好的序列arr[0]arr[1]中(即arr[0]arr[i-1]),讓arr[2]依次與已排好的序列中每個元素比較,找比5大的,最後找到6,將5插入到6的位置,6及6以後已排序元素依次後移。

i依次增大,每一步將arr[i]插入到arr[0]~arr[i-1]中,直到i等於元素總個數,說明已全部排序完成,退出迴圈。

**如下:

void insert_sort(int arr,int length)}}

上述**,在尋找i元素的合適插入位置時,我們是從前往後和已排序序列進行比較的,當插入到元素i時,我們從下標0開始往後尋找,找到了合適插入位置j,此時我們已經遍歷了0到j,然後插入i之前,我們必須把j到i-1的元素全部往後挪一格,也就是說,無論j在哪個位置,插入i時,我們都要完整地遍歷一遍已排序陣列,即便整個序列本來就有序,程式依然會一遍一遍的遍歷已排序序列。

那麼,如果我們從後往前尋找i的插入位置呢,只有當i的插入位置在0時,我們才會完整地遍歷一遍已排序序列,插入位置越靠後,我們比較的次數就越少,當i的位置本來就正確時,我們只需比較一次,當整個序列本來就有序時,時間複雜度就會降低到o(n)。

//函式執行到此處有兩種情況:

//1,j指向從後往前第乙個小於或等於key的元素,只需將key

//插入到此元素後即j+1處即可

//2,已排序序列中沒有比key大的元素,已被全部往後移動一格,

//此時i指向-1,將key插入到arr[0]處剛好也是j+1處 }}

for迴圈裡if語句的內容可以直接寫到for語句的條件部分。

void insert_sort(int arr,int length)

arr[j+1] = key;

}

}

做到這裡,我本以為這個函式已經搞定了,然後查了些資料,對比了一下自己的**,發現有很多提到了「監視哨」,然後研究了一下。

傳進來的那個陣列arr,arr[0]中不儲存有用的元素,所有的資料存在arr[1]~arr[length]中(傳入函式的length值我們規定為有用的元素個數,最後乙個元素就是arr[length]),arr[0]就是監視哨,有兩個作用:

第乙個作用是用來儲存每次待插入的元素,作用和上面那個函式中設定的變數key一樣,監視哨要是只有這麼乙個作用的話,我們為什麼要捨棄建立乙個臨時變數這麼簡單的辦法不用而去用它呢,所以我仔細研究了一下監視哨的第二個作用。

解釋第二個作用之前,我們先看一下我們之前寫的一段**:

for迴圈條件部分,每次都要判斷j>=0是否成立,不能省略。

而如果將帶插入資料存放到arr[0]中,我們只需判斷arr[j]>arr[0],因為即便已排序序列中所有資料都比帶插入資料大,當迴圈進行到j=0時,依然會停下來,然後將帶插入資料插入到arr[1[中。

因此設定監視哨可以省略判斷j>=0這一步,可不要小看了這一步,一次迴圈少判斷一次,n次迴圈就少判斷n次,當要排序的元素數量極其龐大時,提高的效率就十分可觀了。

設定監視哨的函式**:

void insert_sort( int arr, int length)

}

插入排序監視哨和雞尾酒排序

插入排序 帶監視哨 思路 設定a 0 元素為監視哨,a 1 a n 存放資料 a 1 為第乙個元素,根據插入排序的思想,預設a 1 有序,從i 2開始向前進行插入,如 陣列 a 0 1 2 3 4 5 num 0 5 4 3 1 8 注 a 0 初始化為0 注 如果不用監視哨,進行普通插入排序,則不...

直接插入排序

直接插入排序是一種最簡單的排序方法,它的基本思想是依次將每個記錄插入到乙個有序中去。就是說,第i i 1 遍整理時,a1,a2,ai 1已經是排好序的子串行 取出第i個元素ai,在已排好序的子串行為ai找到乙個合適的位置,並將它插到該位置上。易知上述排序當i 1時實際上為空操作,故可直接從i 2開始...

直接插入排序

直接插入排序的演算法思想 直接插入排序 straight insertion sort 的基本操作是將乙個記錄插入到已經排好序的有序表中,從而得到乙個新的 記錄數增 1 的有序表。根據該思想,編寫 如下 從已有序列的第0個記錄開始比較 public static void insertsort1 i...