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

2021-06-19 21:04:17 字數 2013 閱讀 7551

首先看一下例子,將資料乙個個的插入到乙個列表中,插入後這個列表就排序好了

注意:這個列表是遞增的,而且記憶體空間已分配好,只是沒有填充真正的資料,如下**:

int insertsort(mergetype *l, int data)

for (j = l->len-1; j >= 0; --j)

else

}return 0;

}

測試用例的**如下:

#define  listlen 10	

mergetype plist;

mergetype pt;

plist.elem = (int*)malloc(sizeof(int)*listlen);

scanflist(&plist);

plist.len = listlen;

plist.size = listlen;

pt.elem = (int*)malloc(sizeof(int)*listlen);

pt.len = 0;

pt.size = listlen;

memset(pt.elem, 0, listlen*sizeof(int));

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

printlist(&pt);

free(plist.elem);

free(pt.elem);

plist.elem = null;

pt.elem = null;

其他函式以及**請定義請參考:冒泡演算法的改進

直接插入排序

核心思想:是將乙個記錄插入到已排序好的有序表中,從中得到乙個新的、記錄數增1的有序表,也就是說遞增的次序排列每乙個資料,將每乙個資料插入到前面已經排序好的位置中。看下面的**

int insertsort(mergetype* l)

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

} }return 0;

}

這裡從第二個資料開始,比較當前的資料是否小於前面的乙個數,如果小於前面乙個資料,就將當前資料插入到前面的佇列中,在插入到前面資料中的過程,要移動資料

這裡要注意時間的複雜度:

總的比較次數=1+2+……+(i+1-2+1)+……+(n-2+1)= n*(n-1)/2= o(n^2)

總的移動次數=2+3+……+(2+i-1)+ …… + n = (n+2)*(n-1)/2=o(n^2)

當然還要考慮空間複雜度:其實這裡使用了乙個變數的儲存空間作為移動資料的臨時空間

這裡在移動的過程中,可以減少**理解的複雜度,但會在每乙個資料比較的過程中增加一次比較的次數,如下**:

...

if (l->elem[i] < l->elem[i-1]) /*第二個資料比第乙個資料小*/

/*在》=退出當前迴圈*/

l->elem[j+1] = ncompkey; /*此時val[j]

/*折半插入排序演算法*/

int binsertsort(mergetype *l)

else

/*當沒有元素的時候 high=-1*/

l->elem[high+1] = ncompkey;

} return 0;

}

具體什麼原因,請看上面的注釋,這裡為什麼用high+1,但是此時high與low的位置只相差乙個位置,才會跳出while迴圈,請看下面的改進

#if 0

for (j = i-1; j >= high+1; j-- ) /*high或許可以使用low代替*/

l->elem[high+1] = ncompkey;

#else

for (j = i-1; j >= low; j-- ) /*使用low代替high+1*/

l->elem[low] = ncompkey;

#endif

...

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

一.直接插入排序原理 1.插入排序演算法首先要把排序的陣列分成兩部分 第一部分是這個陣列中所有已排序元素,而第二部分就是未排序的元素 即待插入元素 2.將待插入元素和已排序的元素逐一比較,若待插入的元素大,則直接將該元素算入已排序的元素中,否則交換兩元素的位置,並且待插入元素繼續和前乙個元素進行比較...

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

1.直接插入排序 1.1插入排序 insertion sort 的基本思想 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排序好的序列中,直到全部記錄插入完成為止.1.2 基本過程 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直到i ...

插入排序之直接插入排序和折半插入排序

插入排序的基本思想是 將記錄分為有序和無序兩個序列。從無序序列中任取乙個記錄,然後根據該記錄的關鍵字大小在有序序列中查詢乙個合適的位置,使得該記錄放入這個位置後,這個有序序列仍然有序。每插入乙個記錄就稱為一趟插入排序,經過多趟插入排序,使得無序序列中的記錄全部插入到有序序列中,則排序完成。直接插入排...