演算法 排序演算法(二) 插入排序

2021-07-28 02:52:38 字數 2423 閱讀 9482

本篇博文旨在介紹排序演算法中的插入排序;介紹了直接插入排序和希爾排序,並通過時間複雜度和空間複雜度進行了分析;最後用**實現了直接插入排序和希爾排序

1、將陣列分成有序和無序的兩塊區間,有序區間開始只劃分陣列的第乙個元素

2、從無序區間的第乙個數,找到合適的位置插入到有序的陣列中

在最好的情況下,已經有序,只需要比較n-1次

在最壞的情況下,陣列全為逆序,一共需要比較 (n-1)+(n-2)+...+1是乙個等差數列;是乙個n方級別的演算法

時間複雜度為o(n* n)

所以直接插入排序不適合資料量比較大的排序演算法,因為每次挪動元素的代價是很大的

直接插入排序只占用了有限個資料儲存空間,時間複雜度為o(1)

優點:元素少的時候,效率很高;即使完全逆序,但在當今計算機速度的快速發展下,並不是問題

缺點:在元素多的時候,需要挪動狠多元素,並且在逆序或者接近逆序的情況下,效率很差

#pragma once

#includeusing namespace std;

#includevoid print(int* a,size_t n)

cout << endl;

}//插入排序

//時間複雜度:o(n* n)

//思想:

//從陣列的首元素開始,第一次排前兩個數,第二次排前三個數...以此論推

//保證前面拍的元素有序的情況下,再拍後乙個元素時,可以依次比較找到適合的插入位置

//最優情況下,插入排序的時間複雜度為o(n)

//最壞情況下,也就是逆序的排序時間複雜度為o(n* n)

//// [0,i]

void insertsort(int* a, size_t n)

//可能是break跳出,在中部找到合適的位置

//也可能是end == -1,while迴圈結束,需要放在第乙個元素

a[end + 1] = tmp; }}

void testinsertsort()

; insertsort(a, sizeof(a) / sizeof(a[0]));

print(a, sizeof(a) / sizeof(a[0]));

}

希爾排序是對插入排序的一種優化

由於插入排序在逆序或者接近逆序的情況下,需要挪動較多的次數才能將陣列中小的元素挪到前面

希爾排序的是在直接插入排序之前先進行預排序,將較小的元素快速的諾到前面

1、希爾排序是先把元素進行分組,每一組的每乙個元素之間的間隙相等

2、對這些組分別進行直接插入排序

3、將間隙縮小

4、重複第2、第3步驟,直到間隙值為1時,進行最後一趟直接插入排序

希爾排序在有序的情況下也要比較n-1次

在逆序或者接近逆序的情況下能比直接插入排序的效率高

所以 o(n)《希爾排序的時間複雜度

我們認為希爾排序的時間複雜度在n^1.25~1.6n*1.25之間

由於其占用的也是有限的陣列空間,空間複雜度為o(1)

優點:解決了直接插入排序在元素較多、接近逆序的情況下需要挪動較多次數的尷尬

缺點:在元素多的時候,往往我們用快速排序等效率更高的排序;所以希爾排序還是處於乙個非常尷尬的位置

#pragma once

#includeusing namespace std;

#includevoid print(int* a,size_t n)

cout << endl;

}//希爾排序

//時間複雜度:o(n* n)

//思想:

//將陣列分成gap組,然後分組用插入排序

//當gap為1時,就是進行直接插入排序

//希爾排序在逆序或者接近逆序時,會提高插入排序的效率

//將大的元素移到前面的位置花費的次數大大減少

void shellsort(int* a, size_t n)

//進行插入

a[end + gap] = tmp;

} }}void testshellsort()

; shellsort(a, sizeof(a) / sizeof(a[0]));

print(a, sizeof(a) / sizeof(a[0]));

}

希爾排序在序列接近逆序會通過減少換移動的次數從而提高插入排序的效率

但是當元素少時,由於資料少,插入排序並不會比希爾排序多換幾次位置

當元素很多時,很多情況用的是快排和堆排

所以希爾排序是乙個不常用排序

而直接插入排序在元素少的時候非常的適用

排序演算法 二 插入排序

繼上篇 排序演算法 一 基礎篇 這篇部落格咱們聊聊插入排序 經常用的插入排序方法有直接插入排序,折半插入排序,表插入排序和希爾排序。這篇部落格咱們重點說一下直接插入排序 直接插入排序 straight insertion sorting 它是一種簡單的排序方法。基本思想 依次將每個記錄插入到乙個已經...

排序演算法 二 插入排序

概念 把陣列分成兩部分,一部分是有順序的,第二部分是沒有順序的,從沒有順序的陣列中拿出來乙個,把他排在有序陣列中的相應位置 時間複雜度最好 o n 原陣列已經是公升序的。最壞 o n 平均 o n 插入演算法 function insert sort arr else arr j 1 value v...

插入排序演算法 二

插入排序是一種常見的排序演算法,它主要包括直接插入,折半插入和希爾 shell 排序 直接插入排序的改進 等。一組有序陣列需要新增乙個新的資料後,如何保持仍然有序,則最簡單就是遍歷陣列,找到資料應該插入的位置將其插入即可。直接插入 首先,我們將陣列分為待排序和已排序兩個區間,初始化已排序區間只有乙個...