归并排序(MERGE-SORT):
利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之)。
归并排序是稳定排序算法。平均时间复杂度为O(nlogn),因为每次合并的平均时间复杂度为O(n),总的深度为(logn),而且最好、最坏、平均时间复杂度均为O(nlogn)。
代码实现如下:
#include <iostream>
using namespace std;
void MergeSort(int [], int , int , int , int *);
void MergeDiv(int a[], int start, int len, int *p)
{
if (start == len) return;
int mid = (start + len) / 2;
MergeDiv(a, start, mid, p);
MergeDiv(a, mid+1, len, p);
MergeSort(a, start, mid, len, p);
}
void MergeSort(int a[], int start, int mid, int len, int *p)
{
int i = start, j = mid + 1, k = 0;
while (i <= mid && j <= len)
{
if (a[i] <= a[j])
p[k++] = a[i++];
else
p[k++] = a[j++];
}
while(i <= mid)
p[k++] = a[i++];
while(j <= len)
p[k++] = a[j++];
for (i = 0; i < k; i++)
a[start + i] = p[i];
}
int main()
{
int a[] = { 1,3,5,2,4,9,7,8,6,10 };
int len = sizeof(a) / sizeof(int);//计算数组长度
int *p; //定义动态数组作临时空间
p = new int[len]; //给动态数组分配内存
MergeDiv(a, 0, len - 1, p); //注意传入 len - 1
delete[] p;
for (int i = 0; i < len; i++)
cout << a[i] << " ";
system("pause");
}