歸併排序-分治演算法
阿新 • • 發佈:2019-02-19
一、歸併排序思想
基本思想:採用分治演算法,將要排序的陣列分為兩個部分,先分別對這兩個部分進行排序,然後再將兩部分已經排好序的子陣列進行合併,最後形成一個有序的陣列。
二、時間複雜度為
三、原始碼示例
#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;
}