演算法之旅 合併排序

2021-09-08 09:46:49 字數 2403 閱讀 4856

合併排序是用分治策略實現對n 個元素進行排序的演算法。其基本思想是,將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排好序的子集合合併成所要求的排好序的集合。

其遞迴描述如下:

#include #define n 8

typedef int type;

using namespace::std;

type *b = new type[n];

void mergesort(type a, int left, int right);

void merge(type a, type b, int left, int i, int right );

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

}void merge(type a, type b, int left, int i, int right )

while(x <= i) b[k++] = a[x++];

while(y <= right) b[k++] = a[y++];

for(int i = left; i < k; i++)

a[i] = b[i];

}int main()

; mergesort(a, 0, 7);

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

cout << a[i] << ',';

cout << endl;

return 1;

}

消去遞迴的合併演算法如下:

#include typedef int type;

using namespace::std;

void merge(type c, type d, int l, int m, int r)

if(i > m) for(int q = j; q <= r; q++) d[k++] = c[q];

else for(int q = i; q <= m; q++) d[k++] = c[q];

}void mergepass(type x, type y, int s, int n)

if(i + s < n) merge(x, y, i, i+s-1, n-1);

else for(int j = i; j <= n-1; j++) y[j] = x[j];

}void mergesort(type a, int n)

}int main()

; mergesort(num, 8);

for(int j = 0; j < 8; j++)

cout << num[j];

int i;

cin >> i;

return 1;

}

自然合併排序如下:

#include #define n 8

typedef int type ;

using namespace::std;

void mergesort_natural(type a, int n);

int scan(type a, type b, int n);

void merge(type a, type b, int left , int mid, int right);

//自然歸併排序

void mergesort_natural(type a, int n)

}/* 線性掃瞄數列,如果存在逆序的情況就進行合併排序

否則返回乙個為零的中間值mid

*/ int scan(type a, type b, int n)

} } // 當最後乙個組為最後乙個數的極端情況

if((mid !=0) && (right != 0))

merge(a, b, left , mid, right);

return mid;

}void merge(type a, type b, int left , int mid, int right)

while(i <= mid) b[k++] = a[i++];

while(j <= right) b[k++] = a[j++];

}int main()

; mergesort_natural(a, 8);

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

cout << a[i] << ',';

cout << endl;

// int i;

// cin >> i;

return 1;

}

合併排序的乙個弊端就是額外需要儲存器的空間配置,在實際上的實現上,會極度影響速度和快取記憶體的效能!

合併排序演算法

陣列ary的m個元素,ary p ary q ary q 1 ary r 已按曾序排序 使得ary p ary r 按曾序排列 void clibrary merge int ary,int p,int q,int r,int m else k 0 for i p i r i ary i bp k ...

合併排序演算法

主要思想 不斷將已經有序的子陣列a p.q 和a q 1.r 合併為新的有序的陣列a p.r 具體過程可如下操作 分解 將n個元素分成各含n 2個元素的子串行 解決 對兩個子陣列遞迴地排序 合併 合併兩個已經有序的子陣列得到最終的有序陣列。合併 歸併排序 分治策略 include include u...

合併排序演算法

合併排序是用分治策略實現的排序演算法之一。基本思想是 將待排序的元素分成大小大致相同的兩個子集合,分別對這兩個子集合進行排序,最後將排好序的子集合合併成所需要的集合。此方法的時間複雜度t n o nlogn 這種排序方法漸進最優演算法。合併排序 遞迴 include using namespace ...