无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網(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)插入排序的評論 (共 條)

分享到微博請遵守國家法律
忻州市| 潢川县| 邯郸市| 大关县| 宣武区| 湖州市| 东莞市| 渭源县| 从江县| 东莞市| 静乐县| 肇庆市| 民县| 清丰县| 崇文区| 西昌市| 博湖县| 晋宁县| 棋牌| 安龙县| 凌源市| 子洲县| 肃宁县| 九龙县| 龙州县| 哈尔滨市| 运城市| 广元市| 昌图县| 文安县| 通化县| 镇平县| 疏附县| 正镶白旗| 扎鲁特旗| 城市| 桐柏县| 额尔古纳市| 朝阳区| 白朗县| 庄浪县|