数据结构排序-归并排序

归并排序是建立在归并操作上的一种有效的排序算法,时间复杂度是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("\n");
72  }
时间: 2024-10-06 22:20:19

数据结构排序-归并排序的相关文章

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

数据结构--排序

插入排序(上)     基本思想:每次将一个待排序的的元素,按其关键字大小插入到已经排好序的子表的适当位置,直到全部元素插完为止.直接插入排序    简写排序思路:     假设待排序的元素存放在R[0.....n-1]中,在排序过程中,将R划分为两个区间,分别为R[0.....i-1]和R[i....n-1](刚开始时i=1,有序区只有R[0]一个元素),    其中,前一个子区间即是一个已经排好序的子区间,即有序区,后一个子区间则是一个待排序的无序区.   直接插入排序的操作即是:将当前无序

如何给10^7个数据量的磁盘文件进行排序--归并排序

接上面的题目,假若待排序的数据有重复的呢?这里采用的是归并排序. 1.算法分析:     1.稳定性:归并排序是一种稳定的排序.    2.存储结构要求:可用顺序存储结构.也易于在链表上实现.    3.时间复杂度: 对长度为n的文件,需进行lgn趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)..    4.空间复杂度:需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序. 2.总结 与快速排序相

黑马程序员——数据结构排序算法总结

-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 下面是几个网上常见的总结图: 有些不同之处:集中在希尔排序的时间复杂度.快速归并的空间复杂度上 个人总结口诀: 选择N方-->选择排序的最好最坏平均都N方 插入冒泡最好N-->插入冒泡的最好是N,其他是N方 归并堆n乘logN-->归并希尔堆的最好最坏平均都是n乘logN 快速最坏N方-->快速排序的最坏是N方,其他是n乘logN 快速选择希尔堆不稳定-->

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

20175314薛勐 数据结构-排序(选做)

数据结构-排序(选做) 要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己和学

数据结构-排序(选做) 20175204

数据结构-排序(选做) 任务要求 在数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己

数据结构--排序(上)--归并排序

归并排序 核心:两个有序子列的归并. 和两个多项式相加类似 所谓指针,他的本职就是存位置. 这里的指针可以是整数,存的是下标 L最后都不知道在哪了.聪明一点嘛,不要从左往右倒,从右往左倒嘛 归并算法有两种不一样的策略.分而治之,递归的去考虑问题, 分而治之+归并算法. 递归算法 没有平均时间复杂度,没有最坏时间复杂度,是一个稳定的算法, 我们排序算法的时候,我们这个不符合同意的函数接口.我们定义一个函数接口来调用这个函数 那为什么我们要在最外层还声明TmpA呢,我们要看这是怎么用的. 我们用上面

数据结构实践——归并排序算法的改进

本文是针对[数据结构基础系列(9):排序]的项目. [项目 - 归并排序算法的改进] 采用归并排序.快速排序等高效算法进行排序,当数据元素较少时(如n≤64),经常直接使用直接插入排序算法等高复杂度的算法.这样做,会带来一定的好处,例如归并排序减少分配.回收临时存储区域的频次,快速排序减少递归层次等. 试按上面的思路,重新实现归并排序算法. [参考解答] #include <stdio.h> #include <malloc.h> #include <stdlib.h>