插入排序(C 語言實現)

2021-08-19 23:50:16 字數 1692 閱讀 3793

插入排序分為直接插入排序和折半插入排序,直接插入排序利用遍歷的方式查詢插入位置,時間複雜度為n^2,直接插入法由於不會改變相同元素的相對順序,所以直接插入排序是一種穩定的排序演算法。

折半插入排序(二分插入排序),折半插入利用二分法查詢插入位置,只是減少了查詢比較的操作,所以其時間複雜度仍為n^2,二分查詢也是穩定的排序演算法。

兩種排序**如下(codeblocks環境下c語言實現):

#include 

#include

#include //包含rand()和srand()函式

#define list_size 100

#define maxsize 10

//定義順序表結構adt

typedef

struct

sqlist;

//函式宣告

void initlist(sqlist *list); //列表初始化

void acsortlist(sqlist *list); //直接插入排序

void bdownsortlist(sqlist *list); //折半插入排序

void main()

printf("\n最初表長:%d", seqlist.length);

printf("\n最初列表:");

for (int i = 0; i < maxsize; i++)

acsortlist(&seqlist); //呼叫直接插入排序函式

bdownsortlist(&seqlist); //呼叫折半插入排序函式

}//順序表初始化

void initlist(sqlist *list)

//直接插入排序

void acsortlist(sqlist *list) }}

printf("\n按公升序排列(直接插入排序):");

for (int k=0;klength;k++)

printf("%3d",list->elem[k]);

}//折半插入排序

void bdownsortlist(sqlist *list)

for(j=i-1;j>=signr+1;j--)

list->elem[j] = list->elem[j-1];

list->elem[signl-1] = e;

}printf("\n按降序排列(折半插入排序):");

for (int k=0;klength;k++)

printf("%3d",list->elem[k]);

}

程式執行結果

1、直接插入排序:

演算法分析:

將列表元素分成兩部分[1,i-1](已完成排序)和[i,length](待排序元素);

第 i 個元素用中間變數e暫存,依次與[1,i-1]個元素進行比較;

假設 e 比[1,i-1]中的第乙個元素 j 小,則需要將[j,i-1]的元素向後移動;

移動完成後將e中暫存的元素插入到第 j 個元素的位置,覆蓋原資料;

2、折半插入排序:

C語言實現插入排序

插入排序 我在學習一些簡單的演算法,我用文字記錄我的進步。插入排序 其實就是在待排序列中找到,沒有排序好的元素,插入的適當的位置,本文以公升序為例,簡單的講解一下。直接看下面的 include stdio.h include stdlib.h include string.h void swap i...

C語言實現插入排序

插入排序是排序演算法的一種,它不改變原有的序列 陣列 而是建立乙個新的序列,在新序列上進行操作。這裡以從小到大排序為例進行講解。插入排序的基本思想是,將元素逐個新增到已經排序好的陣列中去,同時要求,插入的元素必須在正確的位置,這樣原來排序好的陣列是仍然有序的。在實際使用中,通常是排序整個無序陣列,所...

插入排序 C語言實現

插入排序很好理解,與實際生活緊密相連,或可以說是 於生活中的感悟。插入排序是用的非常多的一種排序方法,因為在實際程式設計中,資料往往是排序好的 所以往排序好的資料中插入新數,此時用插入排序會特別快速。假設十個人按排隊,從矮到高,你會怎麼排?首先,第2人與第1人比,若2比1矮,那麼他們互換位置,否則不...