• 数据结构排序-归并排序


    归并排序是建立在归并操作上的一种有效的排序算法,时间复杂度是O(nlogn)。

    它过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元,如下图所示。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int n;
     5 
     6 /*
     7  * 合并
     8  */
     9 void Merge(int *source, int *target, int i, int m, int n)
    10 {
    11     int j, k;
    12     for (j = m + 1, k = i; i <= m && j <= n; k++)
    13     {
    14         if (source[i] <= source[j])
    15         {
    16             target[k] = source[i++];
    17         }
    18         else
    19         {
    20             target[k] = source[j++];
    21         }
    22     }
    23     while (i <= m)
    24     {
    25         target[k++] = source[i++];
    26     }
    27     while (j <= n)
    28     {
    29         target[k++] = source[j++];
    30     }
    31 }
    32 
    33 /* 
    34  * 归并排序
    35  */
    36  void MergeSort(int *source, int *target, int s, int t)
    37  {
    38      int m, *temp;
    39      if (s == t)
    40      {
    41          target[s] = source[s];
    42      }
    43      else
    44      {
    45          temp = (int*) malloc(sizeof(int) * (t - s + 1));
    46          m = (s + t) / 2;
    47          MergeSort(source, temp, s, m);
    48          MergeSort(source, temp, m + 1, t);
    49          Merge(temp, target, s, m, t);
    50      }
    51  }
    52 
    53  int main()
    54  {
    55      int i;
    56     int *array;
    57     printf("请输入数组的大小:");
    58     scanf("%d", &n);
    59     array = (int*) malloc(sizeof(int) * n);
    60     printf("请输入数据(用空格分隔):");
    61     for (i = 0; i < n; i++)
    62     {
    63         scanf("%d", &array[i]);
    64     }
    65     MergeSort(array, array, 0, n - 1);
    66     printf("排序后为:");
    67     for (i = 0; i < n; i++)
    68     {
    69         printf("%d ", array[i]);
    70     }
    71     printf("
    ");
    72  }
  • 相关阅读:
    Android 简单案例:可移动的View
    Android 简单案例:onSaveInstanceState 和 onRestoreInstanceState
    Android 简单案例:继承BaseAdapter实现Adapter
    Android ImageResizer:inSampleSize
    Android 动画fillAfter和fillBefore
    Android Runtime.getRuntime().exec
    Android Fingerprint系列之google原生界面
    GIF录制工具
    Android Graphviz 安装
    Google Java编程风格指南
  • 原文地址:https://www.cnblogs.com/niceforbear/p/4534566.html
Copyright © 2020-2023  润新知