最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C語言實(shí)現(xiàn)插入排序

2023-04-17 16:41 作者:風(fēng)勉八八  | 我要投稿

問題描述:

????排序問題:

????輸入:N個數(shù)的一個序列<a1,a2,a3,...,an>。

????輸出:輸入序列的一個序列<a1',a2',a3',...,an'>,滿足a1'<=a2'<=a3'<=...<=an'。

雖然排序的是一個序列,但實(shí)際上來說,輸入的是有N個元素的數(shù)組。所以每一個被排序的數(shù)在排序過程中被稱為關(guān)鍵字key。

插入排序的過程:

遍歷數(shù)組中的每個關(guān)鍵字key,將它的位置空出來,然后從key開始往前遍歷,直到找到找排在他前面的比它小的value,key之前value之后的這一段序列后移,然后將key插入到value后面,這就完成了一次插入。

具體實(shí)現(xiàn):

時(shí)間復(fù)雜度分析:

行號???????? 算法語句??????? ?????????????? 執(zhí)行次數(shù)? ??? ????代價(jià) c_i

1????? ??? int i,j,key;??????? ??????????????? ??????1????? ??? ?????????????????c_1

2????? ??? for (j=1;j<=length;j++)???? ???????n+1 ? ???????????????????c_2

3????? ??? key=array[j]; ??????????????????????????n? ? ? ? ? ? ? ????????? ?c_3

4????? ??? i=j-1;?????? ??????????????????????????????? n? ? ? ? ? ? ? ? ????????? c_4

5????? ??? while(i>=0&&array[i]>key) ??????? ?%5Csum_%7Bj%3D2%7D%5E%7Bn%7Dt_j?? ?????????????????????????c_5

6????? ??? array[i+1]=array[i];????? ?????????????????%5Csum_%7Bj%3D2%7D%5E%7Bn%7D(t_j-1)??????????????? ??c_6

7????? ??? i=i-1;?????? ????????????????? ????????????????? ??%5Csum_%7Bj%3D2%7D%5E%7Bn%7D(t_j-1)? ? ? ? ? ? ? ? ? c_7

8????? ??? array[i+1]=key;???? ????????????????????????? n? ? ? ? ? ? ? ? ??????????????????c_8

9????? ??? return array;? ?????????????????????????????????? 1????? ???????????????????????????%20c_9


則其時(shí)間復(fù)雜度為:

T(n)%20%3D%20c_1%20%2B%20c_2(n%2B1)%20%2B%20c_3n%20%2B%20c_4n%20%2B%20c_5%5Csum_%7Bj%3D2%7D%5Ent_j%20%2B%20c_6%5Csum_%7Bj%3D2%7D%5Ent_j%20%2B%20c_7%5Csum_%7Bj%3D2%7D%5Ent_j%20%2B%20c_8n%20%2B%20c_9

將上面的式子合并相同的項(xiàng),得到:

T(n)%20%3D%20c_1%20%2B%20c_2n%20%2B%20c_3n%20%2B%20c_4n%20%2B%20(c_5%2Bc_6%2Bc_7)%5Csum_%7Bj%3D2%7D%5Ent_j%20%2B%20c_8n%20%2B%20c_9

可以看到,第 2 至第 4 項(xiàng)的系數(shù)以及第八項(xiàng)都是 n,因此可以將它們合并為 4cn?的形式,其中 c%3Dc_2%2Bc_3%2Bc_4%2Bc_8,即:

T(n)%20%3D%20(c_5%2Bc_6%2Bc_7)%5Csum_%7Bj%3D2%7D%5Ent_j%20%2B%204cn%20%2B%20c_9%20%2Bc_1%20

在插入排序算法的最壞情況下,數(shù)組的元素按照降序排列,即每個元素都要移動到它應(yīng)該插入的位置,因此第 j?個元素需要移動 j-1?次,因此:

t_j%20%3D%20j-1%2C%20j%3D2%2C3%2C%5Cldots%2Cn

t_j?代入 %5Csum_%7Bj%3D2%7D%5En%20t_j,得到:

%5Csum_%7Bj%3D2%7D%5En%20t_j%20%3D%20%5Csum_%7Bj%3D2%7D%5En%20(j-1)%20%3D%20%5Cfrac%7B(n-1)n%7D%7B2%7D

因此,在最壞情況下,(c_5%2Bc_6%2Bc_7)%5Csum_%7Bj%3D2%7D%5Ent_j可以轉(zhuǎn)化為 (c_5%2Bc_6%2Bc_7)%5Cfrac%7B(n-1)n%7D%7B2%7D。將其代入原式,得到:

T(n)%20%3D%20(c_5%2Bc_6%2Bc_7)%5Cfrac%7B(n-1)n%7D%7B2%7D%20%2B%204cn%20%2B%20c_9%20%2Bc_1%20

因此,在最壞情況下,該插入排序算法的時(shí)間復(fù)雜度仍然是 O(n%5E2),其中 n 為數(shù)組長度。

輸出非增序列:

要輸出非增序列,需要對插入排序算法做一些修改。在原始算法中,每次將一個元素插入已排序序列中的適當(dāng)位置,這樣可以得到遞增的序列。為了得到非增序列,需要修改插入操作的邏輯,即如果插入的元素小于或等于已排序序列中的某個元素,則將其插入到該元素的后面,否則插入到序列的最前面。

本文給出示例代碼如下:

至此,插入排序完畢。


C語言實(shí)現(xiàn)插入排序的評論 (共 條)

分享到微博請遵守國家法律
巧家县| 长泰县| 白银市| 阿鲁科尔沁旗| 屏东县| 河池市| 竹北市| 青冈县| 河西区| 东宁县| 广丰县| 唐河县| 六枝特区| 皋兰县| 车致| 天津市| 子长县| 镇坪县| 塔城市| 横山县| 甘德县| 庐江县| 蚌埠市| 东乌珠穆沁旗| 土默特右旗| 海盐县| 侯马市| 奈曼旗| 西藏| 嘉义市| 玉环县| 敖汉旗| 遂平县| 洞头县| 科尔| 兴仁县| 屏南县| 辛集市| 长宁县| 太湖县| 府谷县|