排序演算法(三) 直接插入排序與折半插入排序

2021-08-10 23:20:03 字數 1598 閱讀 7250

插入類排序預設有乙個已經排好序的序列,而後面的操作就是將未排好序的元素有序插入到已排好序的序列中。

將所有未排好序的元素插入到合適位置,即可得到乙個有序序列。

(1)、直接插入排序

直接插入排序是一種基本的插入排序演算法。演算法思路很簡單!以公升序為例:

<1>、 將序列的第乙個元素看成乙個有序序列(任何乙個單元素都可以看成有序序列)。

<2>、 從第二個元素開始向後遍歷。 將第二個元素插入到第乙個元素的前面(如果比第乙個元素小),否則

位置不變。

<3>、 然後繼續看第三個元素,此時前兩個元素是按公升序有序的。將第三個元素按順序和第二個元素、第一

個元素進行比較,將其放入合適的位置。

<4>、 直到最後乙個元素也被放入前面的有序序列的合適位置,那麼排序完成。

過程如下圖 :

直接插入排序源** :

/*

**功能: 直接插入法公升序排序乙個序列

**引數說明:

**@record : 序列陣列 @len : 序列長度

**返回值: 無

*/void insertsort(int record, int len)

//將待排元素插入到合適的位置

record[j + 1] = value;

}}

(2)、折半插入排序折半插入與直接插入很像!唯一的區別在於它尋找插入位置的方法不同,直接插入是對有序表進行順序

遍歷查詢,而折半插入中的「折半」就體現在此處,它尋找插入位置是進行折半查詢。大大增加了查詢效率,但

未改變移動元素的時間耗費。

折半插入排序源**:

void binsort(int record, int len)

else

}//移動元素,為放置待排元素騰位置

for (j = i - 1; j >= low;j--)

//將待排元素插入到合適的位置

record[low] = value;

}}

int main(void)

; int len = sizeof(record) / sizeof(record[0]);

int i = 0;

printf("排序前: \n");

for (i = 0;i < len;i++)

puts("");

binsort(record, len);

printf("排序後: \n");

for (i = 0;i < len;i++)

puts("");

return 0;

}

執行截圖 :

直接插入排序與折半插入排序

首先看一下例子,將資料乙個個的插入到乙個列表中,插入後這個列表就排序好了 注意 這個列表是遞增的,而且記憶體空間已分配好,只是沒有填充真正的資料,如下 int insertsort mergetype l,int data for j l len 1 j 0 j else return 0 測試用例...

直接插入排序 改進演算法 折半插入排序

這種改進是從比較次數入手的,並沒用減少移動的次數 include define maxsize 20 typedef int keytype typedef struct sqlist void createsqlist sqlist l l.length n void display sqlist...

直接插入排序和折半插入排序演算法

直接插入排序 insertion sort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。設陣列為a 0 n 1 1.初始時,a 0 自成1個有序區,無序區為a 1.n 1 令i 1 2.將a i 併入當前的有序區a 0 i ...