歸併排序 二分

2021-07-29 16:56:59 字數 923 閱讀 4623

歸併排序就是將陣列反覆拆分成兩部分,然後分別在這兩部分裡面再反覆拆分,講拆分成的兩部分按順序排好之後再歸併起來,歸併起來之後再反覆交換位置,最終使整個陣列按順序排列。

具體操作方法(按從小到大排)

拆分成的兩部分依次比較,若前半部分的較小,將其存入陣列tmp中,將前面的下標i++;若後面一部分較小,則將後面一部分的j所指向的值存入tmp中

然後再依次把在區間內還未存入的值存入tmp中

下面程式中tot所求的是交換的次數,交換的原則是:每次交換相鄰兩個值,需要交換多少次才能達到公升序排列。

#include#include#define maxn 1005

using namespace std;

int a[maxn], tmp[maxn], tot;

void mesort(int l, int r)

//將後半部分小於前半部分的值存入tmp之中,tot為此次交換所需的次數(思考為什麼mid-i+1)

else tmp[p++] = a[i++]; //由於前半部分的值較小,直接存

} while(i <= mid) tmp[p++] = a[i++]; // 將還未存入的較大的值再存入tmp中

while(j <= r) tmp[p++] = a[j++];

for(int i=l;i<=r;i++)

a[i]=tmp[i]; //用tmp更新a在l到r區間的值

}int main()

{ int n;

scanf("%d",&n);

for(int i=1;i<=n;i++)

cin>>a[i];

mesort(1,n);

printf("%d\n",tot); //輸出交換的次數

for(int i=1;i<=n;i++)

cout<

二分歸併排序

對n個不同的數構成的陣列a 1 n 進行排序,其中n 2 k。二分歸併排序對待排序陣列先劃分後歸併,以陣列49,38,65,97,76,13,27,57為例,在二分歸併中,需要進行如下順序 劃分將原問題歸結為規模為n 2的2個子問題 繼續劃分,將原問題歸結為規模為n 4的4個子問題。繼續 當子問題規...

二分歸併排序

1.問題 二分歸併排序 對n個不同的數構成的陣列a 1 n 進行排序,其中n 2 k 2.解析 1 對於一組資料a n 申請臨時空間,temp n 用於臨時存放資料,劃分為兩個序列 2 設定兩個指標分別指向兩個序列的首部,其中中間資料mid start end 2劃分到前乙個序列當中 3 比較兩個指...

二分歸併排序

演算法介紹 採用分治的思想,即將大問題轉換為小問題,但是它們的前提一定要一樣,否則就是兩個問題了。歸併排序即對乙個序列進行一分為二,然後對兩個子串行再進行一分為二,直到子列只有乙個數,則返回,通過不斷將子串行兩兩歸併,最後將整個大序列歸併排好序。因為我採取歸併的方式,所以可以想象原來乙個待排序的序列...