歸併排序 tips codes

2021-06-21 16:24:10 字數 1120 閱讀 4078

歸併是o(nlogn)裡比較快的,通常速度非常接近快排。思想也是分治。

比如現在有a[0~n]需要排序

tips:1.先讓a[1 ~ n/2]和a[1 ~ n/2 + 1]分別有序,回溯的時候再合併起來;

2.既然左右兩半都各自有序,那麼比較其各自第乙個元素大小,並不斷插入到乙個臨時陣列裡即可;

while(i <= mid && j <= right)

else

tmp[k++] = a[j++];

} while(i <= mid)

while(j <= right)

這裡k = right - left, 即本次被合併的倆子數列的總長。

3.遞迴地劃分數列,再合併起來。遞迴終止於數列只存在1個元素,即left == right的情況。

void mergesort(int a, int left, int right, int tmp)

}

4.白話經典演算法中為了省掉每次分配臨時陣列的時間,在最上層統一分配了乙個大tmp陣列,送程序式。

完整codes:

#include using namespace std;

void merge(int a, int left, int mid, int right, int tmp)

else

tmp[k++] = a[j++];

} while(i <= mid)

while(j <= right)

for (i = 0; i < k; ++i) }

void mergesort(int a, int left, int right, int tmp)

}bool mergesort(int a, int n)

mergesort(a, 0, n-1, tmp);

delete tmp;

return true;

}int main(void)

; mergesort(a, 10);

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

return 0;

}

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...