归并排序就是将2个有序表组合成一个新的有序表。假定待排序表有n个元素,则可以看成是n个有序的子表,每个子表长度为1,然后两两归并…不停重复,直到合成一个长度为n的有序序列为止。
时间复杂度:每一趟归并为O(n),共log2n趟,所以时间为O(nlog2n) 空间复杂度:O(n) 稳定性:稳定
归并排序非递归实现:
#include <iostream>
using namespace std;
typedef int Type;
void Merge(Type c[], Type d[],
int l,
int m,
int r)
{
int i = l, j = m +
1, k = l;
while (i <= m && j <= r) {
if (c[i] <= c[j]) {
d[k++] = c[i++];
}
else {
d[k++] = c[j++];
}
}
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)
{
int i =
0;
while (i <= n -
2 * s) {
Merge(x, y, i, i + s -
1, i +
2 * s -
1);
i = i +
2 * s;
}
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)
{
Type *b =
new Type[n];
int s =
1;
while (s < n) {
MergePass(a, b, s, n);
s += s;
MergePass(b, a, s, n);
s += s;
}
delete[] b;
}
void print(Type a[],
int n)
{
for (
int i=
0; i<n; ++i) {
cout << a[i] <<
" ";
}
cout << endl;
}
int main(
int argc,
char *argv[])
{
Type a[
6] = {
1,
5,
2,
3,
6,
4};
MergeSort(a,
6);
print(a,
6);
return 0;
}
归并排序递归实现:
#include <iostream>
using namespace std;
typedef int Type;
Type *B =
new Type[
6];
void Merge(Type A[],
int low,
int mid,
int high)
{
int i, j, k;
for (k = low; k <= high; ++k) {
B[k] = A[k];
}
for (i = low, j = mid +
1, k = i; i <= mid && j <= high; ++k) {
if (B[i] <= B[j]) {
A[k] = B[i++];
}
else {
A[k] = B[j++];
}
}
while (i <= mid) {
A[k++] = B[i++];
}
while (j <= high) {
A[k++] = B[j++];
}
}
void MergeSort(Type A[],
int low,
int high)
{
if (low < high) {
int mid = (low + high) /
2;
MergeSort(A, low, mid);
MergeSort(A, mid+
1, high);
Merge(A, low, mid, high);
}
}
void print(Type A[],
int n)
{
for (
int i=
0; i<n; ++i) {
cout << A[i] <<
" ";
}
cout << endl;
}
int main(
int argc,
char *argv[])
{
Type a[
6] = {
1,
5,
2,
3,
6,
4};
MergeSort(a,
0,
5);
print(a,
6);
delete[] B;
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-7431.html