插入排序 insertion sort

2021-10-01 09:59:46 字數 3424 閱讀 6617

插入排序演算法適用於包括向量與列表在內的任何序列結構

​ 插入排序的演算法可以簡要描述為:始終將序列劃分為兩個部分: 有序的字首,無序的字尾;通過迭代,反覆的將字尾中的元素移動到字首中。由此可以看出插入排序演算法的不變性:

在任何時刻,相對於當前節點e = s[r], 字首s[0,r]總是業已有序

​ 演算法開始時字首為空,不變性自然滿足。接下來,借助有序序列的查詢演算法,可在該字首中定位到不大於e的最大元素。 於是只是需要將e從無序字尾中取出,並緊鄰查詢返回的位置之後插入,可以使有序字首的範圍擴大至s[0,r]。如此,該字首範圍可不斷拓展。當其最終覆蓋整個序列時,亦整體有序。

1. 鍊錶的插入排序:

鍊錶的插入刪除操作僅需要o(1)時間,但在字首中搜尋插入位置要花費o(n)時間。

/* 列表的選擇排序 */

void

insertsort

(listnode* phead)

}

/* 節點的插入操作 */

void

insert

(listnode* phead, listnode* target)

if(curr == target)

// 若不需要交換位置

p = curr;

// 從curr的位置開始

while

(p->next != target)

// 找到字首的末尾節點

prev->next = target;

// 完成 prev 與 target 的連線

p->next = target->next;

// 字首的末尾節點指向字尾的開始節點

target->next = curr;

// 完成 target 與 curr 的連線

}

2. 陣列的插入排序(int)
void

insertsort

(int arr,

int n)

}static

intbinsearch

(int arr,

int n,

int target)

return

--lo;

// 返回不小於target的最大的秩

}

3. c 泛型實現

insertsort.h

#pragma once 

#define _crt_secure_no_warnings

#include

#include

#include

void

insertsort

(void

*elemaddr,

int elemsize,

int elemnum,

int(

*cmpfn)

(const

void*,

const

void*)

);static

intbinsearch

(void

*elemaddr,

int elemsize,

int elemnum,

const

void

* target,

int(

*cmpfn)

(const

void*,

const

void*)

);

2.insertsort.c

#define _crt_secure_no_warnings

#include

#include

#include

#include

"insertsort.h"

void

insertsort

(void

*elemaddr,

int elemsize,

int elemnum,

int(

*cmpfn)

(const

void*,

const

void*)

)memmove((

char

*)pos + elemsize, pos,

(i-index)

*elemsize)

;memcpy

(pos, temp, elemsize);}

free

(temp);}

static

intbinsearch

(void

*elemaddr,

int elemsize,

int elemnum,

const

void

* target,

int(

*cmpfn)

(const

void*,

const

void*)

)return

--lo;

}

usesort.c
#if 1

#define _crt_secure_no_warnings

#include

#include

#include

#include

"insertsort.h"

static

cmpint

(const

void*,

const

void*)

;void

test01

(void);

int len =

sizeof

(arr)

/sizeof

(arr[0]

);insertsort

(arr,

sizeof

(int

), len, cmpint)

;for

(int i =

0; i < len;

++i)

putchar

('\n');

}static

cmpint

(const

void

*vp1,

const

void

*vp2)

elseif(

*(int*

)vp1 <*(

int*

)vp2)

else

return0;

}int

main

(int argc,

char

*ar**)

#endif

插入排序 折半插入排序

折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...

插入排序 折半插入排序

折半插入排序是基於直接插入排序的優化。直接插入排序 將第i個元素插入時,通過折半查詢的方式,來查詢第i個元素合適的位置。當0 i 1 位置上的元素都已經排序ok,現需要插入第i個元素,設其值為temp 令low 0,high i,mid high low 2。那麼temp可能插入的位置是 low h...

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...