插入排序分為直接插入排序和折半插入排序,直接插入排序利用遍歷的方式查詢插入位置,時間複雜度為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矮,那麼他們互換位置,否則不...