国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

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

歸并排序

2021-09-20 21:34 作者:氫氟酸_Official  | 我要投稿

歸并排序(英語(yǔ):merge sort)是一種采用了分治思想的排序算法。

所謂分治,即為分而治之。首先把一個(gè)序列分成兩部分,然后對(duì)這兩部分序列分別進(jìn)行排序。

那末如何對(duì)這兩部分序列進(jìn)行排序呢?請(qǐng)重新閱讀上面這句話。

說(shuō)白了,我們遞歸的把一個(gè)數(shù)列進(jìn)行分解,直到分割出的最小單元元素?cái)?shù)量<=2時(shí)。舉個(gè)例子,有一個(gè)11個(gè)元素的數(shù)列。

11 = 5+6 = 2 + 3 + 3 + 3 = 2 + 2 +1 +2 + 1 + 2 + 1

接下來(lái)模仿上面分解的過(guò)程進(jìn)行合并,在合并的過(guò)程中完成排序。這樣,排序好2個(gè)和1個(gè)元素的單元,然后把合并成3個(gè)和4個(gè)元素的單元,這時(shí)這樣的單元已經(jīng)部分有序,接下來(lái)繼續(xù)排序3個(gè)和4個(gè)元素的單元,然后再合并成……以此類推,直到合并成一個(gè)長(zhǎng)度為n的單元。

這樣我們可以得到歸并排序的工作過(guò)程:

三個(gè)步驟:

  1. 將數(shù)列劃分為兩部分;

  2. 遞歸地分別對(duì)兩個(gè)子序列進(jìn)行歸并排序;

  3. 合并兩個(gè)子序列。

不難發(fā)現(xiàn),歸并排序的前兩步都很好實(shí)現(xiàn),關(guān)鍵是如何合并兩個(gè)子序列。注意到兩個(gè)子序列在第二步中已經(jīng)保證了都是有序的了,第三步中實(shí)際上是想要把兩個(gè)?有序?的序列合并起來(lái)。

歸并排序的性質(zhì):

歸并排序是一種穩(wěn)定的排序算法。

歸并排序的最優(yōu)時(shí)間復(fù)雜度、平均時(shí)間復(fù)雜度和最壞時(shí)間復(fù)雜度均為O(n log n)?。

歸并排序的空間復(fù)雜度為 O(n)


C++代碼實(shí)現(xiàn)↓

鏈接:https://baike.baidu.com/item/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F/1639015?fr=aladdin

鏈接:https://oi-wiki.org/basic/merge-sort/


#include?<stdlib.h>
#include?<stdio.h>
?
void?Merge(int?sourceArr[],int?tempArr[],?int?startIndex,?int?midIndex,?int?endIndex)
{
????int?i?=?startIndex,?j=midIndex+1,?k?=?startIndex;
????while(i!=midIndex+1?&&?j!=endIndex+1)
????{
????????if(sourceArr[i]?>?sourceArr[j])
????????????tempArr[k++]?=?sourceArr[j++];
????????else
????????????tempArr[k++]?=?sourceArr[i++];
????}
????while(i?!=?midIndex+1)
????????tempArr[k++]?=?sourceArr[i++];
????while(j?!=?endIndex+1)
????????tempArr[k++]?=?sourceArr[j++];
????for(i=startIndex;?i<=endIndex;?i++)
????????sourceArr[i]?=?tempArr[i];
}
?
//內(nèi)部使用遞歸
void?MergeSort(int?sourceArr[],?int?tempArr[],?int?startIndex,?int?endIndex)
{
????int?midIndex;
????if(startIndex?<?endIndex)
????{
????????midIndex?=?startIndex?+?(endIndex-startIndex)?/?2;//避免溢出int
????????MergeSort(sourceArr,?tempArr,?startIndex,?midIndex);
????????MergeSort(sourceArr,?tempArr,?midIndex+1,?endIndex);
????????Merge(sourceArr,?tempArr,?startIndex,?midIndex,?endIndex);
????}
}
?
int?main(int?argc,?char?*?argv[])
{
????int?a[8]?=?{50,?10,?20,?30,?70,?40,?80,?60};
????int?i,?b[8];
????MergeSort(a,?b,?0,?7);
????for(i=0;?i<8;?i++)
????????printf("%d?",?a[i]);
????printf("\n");
????return?0;
}


推薦例題:

洛谷P1309,P1908,P1774等


歸并排序的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
确山县| 五大连池市| 九寨沟县| 无为县| 武定县| 偏关县| 若尔盖县| 旬阳县| 大同市| 监利县| 高青县| 江门市| 色达县| 上思县| 荣昌县| 邻水| 五大连池市| 芜湖市| 高唐县| 垦利县| 商丘市| 商城县| 西华县| 石家庄市| 娄烦县| 扶风县| 天长市| 运城市| 花垣县| 澜沧| 高唐县| 南城县| 边坝县| 武邑县| 兴和县| 肥西县| 咸宁市| 乐至县| 陇南市| 乌鲁木齐市| 婺源县|