1 归并排序思想
基本思想:采用分治算法,将要排序的数组分为两个部分,先分别对这两个部分进行排序,然后再将两部分已经排好序的子数组进行合并,最后形成一个有序的数组。
2 时间复杂度
3 源码示例
#include "stdafx.h"
#define N 6
int A[N] = {9,4,1,6,8,7};
/*
数组A[low...mid]和A[mid+1...high]已排好序,将其合并为一个有序数组
*/
void Merge(int low, int mid, int high)
{
int h, iptr, j, k;
int B[N];
h = low;
iptr = low;
j = mid + 1;
while (h <= mid && j <= high)
{
if (A[h] <= A[j])
{
B[iptr] = A[h];
h++;
}
else
{
B[iptr] = A[j];
j++;
}
iptr++;
}
if (h > mid)
{
for (k = j; k <= high; k++)
{
B[iptr] = A[k];
iptr++;
}
}
else
{
for (k = h; k <= mid; k++)
{
B[iptr] = A[k];
iptr++;
}
}
for (k = low; k <= high; k++)
A[k] = B[k];
}
void MergeSort(int low, int high)
{
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(low, mid);
MergeSort(mid + 1, high);
Merge(low, mid, high);
}
}
int main()
{
printf("归并排序前:\n");
for (int i = 0; i < N; i++)
printf("%d\t", A[i]);
MergeSort(0, N - 1);
printf("\n\n********************************************************\n\n归并排序后:\n");
for (int i = 0; i < N; i++)
printf ("%d\t", A[i]);
printf("\n\n\n\n");
return 0;
}