資料結構之排序 1 插入排序

2021-08-18 07:01:14 字數 3126 閱讀 5173

折半插入排序

希爾排序

各演算法複雜度表

插入排序主要包括三個:直接插入排序、折半插入排序和希爾排序。基本思想都是:

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中,直到全部記錄插入完成。

下面依次進行講解並程式設計實現。

主要思想:

1. 迴圈i從1~n-1,每次迴圈執行步驟2-4。

2. 查詢arr[i]arr[0]~arr[i-1]的插入位置k。

3. 將arr[k]~arr[i-1]每個元素後移乙個位置。

4. 將arr[i]複製到arr[k]

如圖所示:

時間複雜度:

平均下來,約為((

n2+n

)/4)

次,複雜度為o(

n2) 。

穩定性:穩定

適用性:用順序表時,從後往前比較,比較後直接交換;單鏈表的話,從前往後查詢。

核心**如下:

void insertsort(int arr, int n)}}

更一般的,可以引入哨兵arr[0],(哨兵:簡化邊界條件而引入的附加結點)有兩個作用:

1. 可以減少臨界的比較,即不用比較j>=0

2. 暫時存放待插入的元素

如下:

void insertsort(int arr, int n)//這裡n是待排序數個數,不包括哨兵}}

如果待排序的是結構的話,也一樣:

#include 

using

namespace

std;

struct elem

elem(int key) :key(key){}

bool

operator

< (const elem& other)

elem& operator = (const elem& other)

friend ostream& operator

<< (ostream &stream, const elem &e)

};void print(elem arr, int n, int i)

cout

<< endl;

}void insertsort(elem arr, int n)

print(arr, n+1, i-1);

}}int main()

,, , , , , , , };

print(arr, 9, 0);

insertsort(arr, 8);

system("pause");

}

第0輪: 0 6 5 3 1 8 7 2 4

第1輪: 5 5 6 3 1 8 7 2 4

第2輪: 3 3 5 6 1 8 7 2 4

第3輪: 1 1 3 5 6 8 7 2 4

第4輪: 1 1 3 5 6 8 7 2 4

第5輪: 7 1 3 5 6 7 8 2 4

第6輪: 2 1 2 3 5 6 7 8 4

第7輪: 4 1 2 3 4 5 6 7 8

思路是:由於前一部分是已排序的,所以不再一次次比較,而是二分查詢到待插入元素應該在哪個位子,再插入,後移操作統一放到一起。

void insertsort(int arr, int n)

for (j = i - 1; j>=high+1 ; --j)//high+1到i-1的數後移

arr[j + 1] = arr[j];

arr[high + 1] = arr[0];//待插入數放到high+1}}

用了二分查詢僅減少了比較的複雜度,從o(

n2) 到o(

nlog

2n) ,且次數與數列初始狀態無關,僅取決於個數n,即最好情況最差情況都是這麼多。

移動次數仍然一樣,但移動次數與數列初始狀態有關,最好情況為0,最差情況複雜度為o(

n2) ;

故總的來說,時間複雜度

平均為o(

n2) 。

穩定性:穩定。

空間複雜度:o(

1)

基本思路:先將待排序表分割成若干個形如l[

i,i+

d,i+

2d,.

..i+

kd] 的特殊子表,分別進行直接插入排序,隨著

d 不斷減小至1,整個表也會趨向於「基本有序」,最後

d為1時,進行一次整體的直接插入排序。

和直接插入相比,演算法修改為:

1. 前後比較增量為dk,不是1。

2. arr[0]不再是哨兵,而僅作為暫時儲存用,即判斷越界用不到了。

void shellsort(int arr, int n)}}

}

空間複雜度:用了3個輔助單元,為o(

1)時間複雜度:依賴於增量序列的函式。

穩定性:不穩定。

適用性:僅適用於順序儲存的線性表。(因為增量不為1,要能以常數時間訪問到任何乙個元素,鏈式就不行了。)

演算法平均時間複雜度

最好時間複雜度

最差時間複雜度

空間複雜度

穩定性備註

直接插入排序o(

n2) o(

n)o(

n2) o(

1)穩定

折半插入排序o(

n2) o(

nlog

2n) o(

n2) o(

1)穩定

shell排序o(

n1.3

) o(

n)o(

n2) o(

1)不穩定

和增量序列有關

資料結構 排序之插入排序

插入排序o n2 的執行時間 思想是 若陣列長度為n 那麼把陣列序號從1到n 1的值依次往前進行比較 這裡需要乙個for迴圈 注意每個數在比較的時候它前面的資料都是已經排好序號的 因為從序號為1時就開始排序了 注意我們這裡用類似堆中下浮和上浮的交換方法 把需要交換的資料拿出來 和前面的資料依次進行比...

資料結構排序之插入排序

package sort 最簡單的排序演算法之一是插入排序 insertion sort 插入排序由n 1躺排序組成。對於 p 1到n 1 趟,插入排序保證從位置0到位置p上的元素為已排序狀態。插入排序利用了這樣的 事實 已知位置0到位置p 1 上的元素處於排過序的狀態。例子 原始陣列 34 8 6...

資料結構之插入排序 折半插入排序

排序思路 通過折半查詢的方式找到合適的插入位置再插入。演算法實現 public class biinsertsort else 插入點在 mid 1,right left mid 1 直到找到合適的位置 left或right 1 接下來就將left right 1後的元素後移 for int j i...