資料結構 直接插入排序

2021-05-12 17:18:04 字數 1739 閱讀 4369

/*直接插入排序*/

#include

#include

typedef struct 

int *elem;

int length;

}sqlist;

void initsqlist(sqlist *l)

int i;

printf("請輸入元素個數:");

scanf("%d",&(l->length));

l->elem = (int *)malloc(sizeof(int)*(l->length+1));

printf("請輸入需排序元素:");

for(i = 1; i <= l->length; i++)

scanf("%d",l->elem+i);

void insertsort(sqlist *l)

int i,j;

for(i = 2; i <= l->length; i++)

l->elem[0] = l->elem[i];

if(l->elem[0] < l->elem[i-1])

for(j = i-1; l->elem[0] < l->elem[j]; j--)

l->elem[j+1] = l->elem[j];  

l->elem[j+1] = l->elem[0];

void print(sqlist l)

int i;

for(i = 1; i <= l.length; i++)

printf("%5d",l.elem[i]);

int main()

sqlist l;

initsqlist(&l);

insertsort(&l);

print(l);

return 0;

演算法分析:直接插入排序是一種最簡單的排序方法.其基本思想可以歸納為:找乙個,排乙個

基本實現過程:以第乙個元素為基準開始,向後取元素,取乙個就進行查詢一次,並插入.這樣產生的就是一次增加乙個元素的有序表.故對於元素個數為n的表,需要進行查詢插入n-1次,需要引入乙個外部空間.(在程式裡是將陣列的第0號位置作為外部空間)用來儲存正在插入的元素.

思想分析:對於排序,我們日常生活中並不少見.甚至可以說極其常見.比如說圖書館的管理員將書有序地插到書架上,首先當然是找到書的編號是在哪個大類,找到那個書架,然後將書的編號與其他的進行比較後進行插入操作.這就類似於插入時的比較.

也就是說,在日常生活中,當面對一批帶有編號的物品要求我們按照編號進行排序的時候,我們最先也是最容易想到的方法就是先拿乙個出來當做基準,然後再新增乙個物品與這個物品做比較,這樣就可以得到2個有序地物品,接著再拿出乙個,進行比較,接著就能得到三個有序地物品...如此反覆,最後就能得到有序的序列. 雖然效率不高...

然而,在生活中插入的時候,我們進行查詢的時候,當面對已經有的有序序列(設物品個數為n),我們會根據要排序物品的序號進行插入,也就是說我們不會每乙個都去比較一次.比如已知的有序序列的第乙個序號為0004而最後的乙個序號為0550.如果你手上要插入的物品的序號是0200,你一定不會從頭或者從最後開始乙個乙個地進行比較.你會直接到中間進行比較---顯然這樣會快很多,因為你能確定原來的序列是有序的.這樣就得到了插入排序的改進演算法之一-----折半插入排序,只不過由於位置是確定的,所以移動元素的個數也就一定是確定的.也就是說優化的地方只是在查詢這個部分,利用排好的序列是有序表這個特定,將原來的效率比較低下的乙個乙個比較的查詢換成了折半查詢,即差距也不是很大..

資料結構 直接插入排序

直接插入排序 將待插入子串行元素逐步插入到有序序列的執行過程。設有一待排序序列s 其中是有序的,是無序的,要把後面無需的元素,乙個乙個的插入到前面有序的集合中去。如下面的序列可以分為兩個子串行 和 初始序列 75 88 68 92 88 62 77 96 80 72 第一次排序 75 88 68 9...

資料結構 直接插入排序

將乙個記錄插入到已排好序的序列中,從而得到乙個新的有序序列 將序列的第乙個資料看成是乙個有序的子串行,然後從第二個記錄逐個向該有序的子串行進行有序的插入,直至整個序列有序 可以選擇不同的方法在已經排好序資料表中尋找插入位置。根據查詢方法不同,有多種插入排序方法,下面要介紹的是直接插入排序。設待排序的...

資料結構 直接插入排序

直接 插入排序 straight insertion sort 是一種最簡單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到乙個新的 記錄數量增1的有序表 在日常生活中,經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。例如 一組從小到大排好順序的資料列,通常稱之為有序...