归并排序(分治法)

来源:互联网 发布:杜兰特各赛季数据统计 编辑:程序博客网 时间:2024/05/01 08:42

Merge Sort

原始数据使用随机函数生成。 采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。 数据个数由宏定义给出,也可以轻松地改为输入。 原始数据使用随机函数生成。 采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。 数据个数由宏定义给出,也可以轻松地改为输入。

排序时需要一个与数据规模相等的辅助存储。

/* * * 归并排序算法程序 * */#include <stdio.h>#include<stdlib.h>#include <time.h>//#define DEBUG#define N 7void getData(int [], int);void outputData(int [], int);void mergesort(int a[], int temp[], int low, int high);void merge(int a[], int temp[], int low, int middle, int high);int main(void){  int a[N], temp[N];  getData(a, N); /* 获得数据放入数组a中 */  printf("Unordered datas: ");  outputData(a, N);  mergesort(a, temp, 0, N - 1);  printf("In sorted order: ");  outputData(a, N);  return 0;}void mergesort(int a[], int temp[], int low, int high){  int middle;  if(low < high)  {      middle = (low + high) / 2;#ifdef DEBUG      printf("In sorted order: ");      outputData(a, N);      printf("middle=%d\n",middle);#endif      mergesort(a, temp, low, middle);      mergesort(a, temp, middle+1, high);      merge(a, temp, low, middle, high);  }}void merge(int a[], int temp[], int low, int middle, int high){    int i = low, j=middle+1, k = low;    while(i <= middle && j <= high)    {        if(a[i] < a[j])            temp[k++] = a[i++];        else            temp[k++] = a[j++];    }    while(i <= middle)        temp[k++] = a[i++];    while(j <= high)        temp[k++] = a[j++];    for(i=low; i<=high; i++)         a[i] = temp[i];}void getData(int d[], int n){    time_t t;    srand((unsigned) time(&t));  /* 设置随机数起始值 */    int i;    for(i=0; i < n; i++)        d[i] = rand() % 1000; /* 获得0-999之间的整数值 */}void outputData(int d[], int n){    int i;    for (i = 0; i < n; i++)      printf("%d ", d[i]);    printf("\n");}

1 0
原创粉丝点击