二 插入排序

2021-07-11 06:46:03 字數 2526 閱讀 5149

有乙個已經有序的資料序列,要求在這個已經排好的資料序列中插入乙個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——

插入排序法,插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序,

時間複雜度為o(n^2)。是穩定的排序方法。插入演算法把要排序的

陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後乙個元素除外(讓陣列多乙個空間才有插入的位置),而第二部分就只包含這乙個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步將乙個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。

關鍵碼是資料元素中某個資料項的值,用它可以標示乙個資料元素。

分類 包括: 直接插入排序,二分插入排序(又稱折半插入排序),

鍊錶插入排序,

希爾排序(又稱縮小增量排序)。屬於穩定排序的一種(通俗地講,就是兩個相等的數不會交換位置) 。

直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的紀錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中,直到所有的紀錄插入完為止,得到乙個新的有序序列。

例如,已知待排序的一組紀錄是:

60,71,49,11,24,3,66

假設在排序過程中,前3個紀錄已按關鍵碼值遞增的次序重新排列,構成乙個有序序列:

49,60,71

將待排序紀錄中的第4個紀錄(即11)插入上述有序序列,以得到乙個新的含4個紀錄的有序序列。首先,應找到11的插入位置,再進行插入。可以講11放入陣列的第乙個單元r[0]中,這個單元稱為監視哨,然後從71起從右到左查詢,11小於71,將71右移乙個位置,11小於60,又將60右移乙個位置,11小於49,又再將49右移乙個位置,這時再將11與r[0]的值比較,11≥r[0],它的插入位置就是r[1]。假設11大於第乙個值r[1]。它的插入位置應該在r[1]和r[2]之間,由於60已經右移了,留出來的位置正好留給11.後面的紀錄依照同樣的方法逐個插入到該有序序列中。若紀錄數n,續進行n-1趟排序,才能完成。

直接插入排序的演算法思路:

(1) 設定監視哨r[0],將待插入紀錄的值賦值給r[0];

(2) 設定開始查詢的位置j;

(3) 在陣列中進行搜尋,搜尋中將第j個紀錄後移,直至r[0].key≥r[j].key為止;

(4) 將r[0]插入r[j+1]的位置上。

直接插入排序演算法:

public void zjinsert (redtype r,int n)

,}

,} …

,}

每次處理就是將無序數列的第乙個元素與有序數列的元素從後往前逐個進行比較,找出插入位置,將該元素插入到有序數列的合適位置中。

假設在乙個無序的陣列中,要將該陣列中的數按插入排序的方法從小到大排序。假設啊a=;插入排序的思想就是比大小,滿足條件交換位置,一開始會像氣泡排序一樣,但會比冒泡多一步就是交換後(a[i]=a[i+1]後)原位置(a[i])會繼續和前面的數比較滿足條件交換,直到a[i+1]前面的陣列是有序的。比如在第二次比較後陣列變成a=;

演算法設計有很多方法。插入排序使用的是增量(incremental)方法;在排好子

陣列a[1..j-1]後,將a[j]插入,形成排好序的子陣列a[1..j];

步驟⒈從有序數列和無序數列開始進行排序;

⒉處理第i個元素時(i=2,3,…,n),數列是已有序的,而數列是無序的。用ai與ai-1,a i-2,…,a1進行比較,找出合適的位置將ai插入;

⒊重複第二步,共進行n-i次插入處理,數列全部有序。

思路假定這個

陣列的序是排好的,然後從頭往後,如果有數比當前外層元素的值大,則將這個數的位置往後挪,直到當前外層元素的值大於或等於它前面的位置為止.這具演算法在排完前k個數之後,可以保證a[1…k]是區域性有序的,保證了插入過程的正確性.

一般來說,插入排序都採用in-place在

陣列上實現。具體演算法描述如下:

⒈ 從第乙個元素開始,該元素可以認為已經被排序

⒉ 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置

⒋ 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

⒌ 將新元素插入到下一位置中

⒍ 重複步驟2~5

如果比較操作的代價比交換操作大的話,可以採用

二分查詢法來減少比較操作的數目。該演算法可以認為是插入排序的乙個變種,稱為

二分查詢排序。

void insert_sort(int*array,unsigned int n)

*(array+j)=temp;

}}

或者

void inertionsort(int array, int len) // o(n*n)

; for (i = 1; i= 0) && (array[j]>temp); j--)

array[k] = temp;//元素插入

}}

插入排序(二) 表插入排序

上篇文章已經提到直接插入排序中,時間消耗在了元素間的比較次數和移動這兩方面。折半插入排序可以減小比較次數,而表插入排序則可以避免元素移動。但它需要建立資料結構,並且需要額外的空間 省時一般都耗空間,這個在演算法上很常見哦!首先給出表結構,定義如下 define size 100 typedef st...

插入排序(二)

author administrator 插入排序原理 對於給定的一組記錄,初始時假設第乙個記錄自成乙個有序序列,其餘記錄為無序序列 接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直至最後乙個記錄插入到有序序列中為止 從原陣列第2個元素開始,遍歷陣列,依次把遍歷到...

插入排序(二)

author administrator 插入排序原理 對於給定的一組記錄,初始時假設第乙個記錄自成乙個有序序列,其餘記錄為無序序列 接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直至最後乙個記錄插入到有序序列中為止 從原陣列第2個元素開始,遍歷陣列,依次把遍歷到...