归并排序算法
归并排序算法

归并排序算法

使用 C 语言实现归并排序算法

源代码如下所示

#include "malloc.h"

//升序排序,A[p]-A[q],A[q + 1]-A[r]这两部分已经排序好
void Merge(unsigned int* A, unsigned int p, unsigned int q, unsigned int r)
{
  unsigned int n1, n2, i, j, k;
  unsigned int* L;
  unsigned int* R;

  //计算数组1和数组2的大小
  n1 = q - p + 1;
  n2 = r - q;

  //申请动态内存
  L = malloc((n1 + 1) * sizeof(unsigned int));
  R = malloc((n2 + 1) * sizeof(unsigned int));
  if ((NULL == L) || (NULL == R))
  {
    printf("Merge: fail to malloc\r\n");
    while (1) {}
  }

  //保存第一部分数据
  for (i = 0; i < n1; i++){L[i] = A[p + i];}

  //保存第二部分数据
  for (j = 0; j < n2; j++){R[j] = A[q + 1 + j];}

  //设置哨兵
  L[n1] = 0xFFFFFFFF;
  R[n2] = 0xFFFFFFFF;

  //排序
  i = 0; j = 0;
  for (k = p; k <= r; k++)
  {
    if (L[i] <= R[j])
    {
      A[k] = L[i];
      i++;
    }
    else
    {
      A[k] = R[j];
      j++;
    }
  }

  //释放动态内存
  free(L);
  free(R);
}

//归并排序
void MergeSort(unsigned int* A, unsigned int p, unsigned int r)
{
  unsigned int q;
  
  if (p < r)
  {
    q = (p + r) / 2;
    MergeSort(A, p, q);
    MergeSort(A, q + 1, r);
    Merge(A, p, q, r);
  }
}

测试代码如下所示

#include "stdio.h"
#include "malloc.h"
#include <time.h>

#define TEST_LEN 64

void main(void)
{
  unsigned int* a;
  unsigned int i, data;

  //设置随机数种子
  srand((unsigned)time(NULL));

  //申请动态内存
  a = malloc(TEST_LEN * sizeof(unsigned int));
  if (NULL == a)
  {
    printf("main: fail to malloc\r\n");
    while (1) {}
  }

  //填充数组里边的内容
  for (i = 0; i < TEST_LEN; i++)
  {
    do
    {
      data = rand() % 256;
    } while (0xFFFFFFFF == data);
    a[i] = data;
  }

  //排序
  MergeSort(a, 0, TEST_LEN - 1);

  //打印
  for (i = 0; i < TEST_LEN; i++)
  {
    printf("%d, ", a[i]);
  }

  //释放动态内存
  free(a);

  while (1) {}
}