C/C++实现数据结构之2路-归并排序

归并排序和交换排序、选择排序的思想不一样,归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假定待定排序表含有n个记录,则可以看成是N个有序的子表。每个子表长度为1,然后两两归并,得到N/2个长度为2或1的有序表。再两两归并。如此重复,直到获得一个长度为n的有序表为止。这种方法称为2路归并排序

函数实现:

merge()函数的功能是将两个有序表归并为一个有序表,其中我们需要使用到辅助数组arr2来存储排序结果。在这里我们假设对数组进行操作。不对有序表结构进行排序。由于数组的下标是从0开始,就变得和普通的有序表不同。一般来说。有序表的第0个元素在排序中会作为哨兵元素。哨兵元素的种种好处在这里就不在阐述了。

设两段有序表A[low,mid],B[mid+1,high]存放在同一顺序表中相邻的位置上。每次从数组中找两个数,进行大小比较,然后存入辅助数组,然后重复执行这个操作。直到其中一段有序表被遍历完毕。即这里的循环条件可以设为
low<mid&&mid+1<high(伪代码)

当其中一段有序表被遍历完后,我们可以将另一段有序表直接存入辅助数组。由于是有序表,所以直接存入辅助表不会导致有序表的特性被破坏。

下面我们来看代码
int arr1[10] = {9,8,7,6,5,4,3,2,1,0}, arr2[10];//原数组arr1,临时空间数组arr2
void merge(int low, int mid, int high) {int i = low, j = mid + 1, k = low;while (i <= mid && j <= high)if (arr1[i]<arr1[j])arr2[k++] = arr1[i++];elsearr2[k++] = arr1[j++];while (i <= mid)arr2[k++] = arr1[i++];while (j <= high)arr2[k++] = arr1[j++];for (i = low; i <= high; i++) {arr1[i] = arr2[i];}
}

上述代码中的while循环只会执行一个!!!!!

以上代码只能将两个有序表合并为一个有序表。但是由于程序刚开始的时候,有序表为单个元素本身,所以我们需要一个递归来使我们的merge函数每次执行时的表都为有序表。这个我们需要通过一个函数mergesort来操控。

void mergeSort(int a, int b) {//直到a=b时,停止递归。if (a<b) {int mid = (a + b) / 2;mergeSort(a, mid);mergeSort(mid + 1, b);merge(a, mid, b);}
}

当a=b时,递归停止,那么a减b的绝对值仅为1,那么能够保证第一次传入Merge函数的是一个有序子表。从而导致每次传入的表都为有序子表。

完整代码

#include "stdio.h"int arr1[10] = {9,8,7,6,5,4,3,2,1,0}, arr2[10];//原数组arr1,临时空间数组arr2
void merge(int low, int mid, int high) {int i = low, j = mid + 1, k = low;while (i <= mid && j <= high)if (arr1[i]<arr1[j])arr2[k++] = arr1[i++];elsearr2[k++] = arr1[j++];while (i <= mid)arr2[k++] = arr1[i++];while (j <= high)arr2[k++] = arr1[j++];for (i = low; i <= high; i++) {arr1[i] = arr2[i];}
}void mergeSort(int a, int b) {//直到a=b时,停止递归。if (a<b) {int mid = (a + b) / 2;mergeSort(a, mid);mergeSort(mid + 1, b);merge(a, mid, b);}
}int main() {int i;mergeSort(0, 9);return 0;
}

当然你们也可以使用动态定义的方式来定义数组,那么这里传入mergeSort的参数就需要改变了。

C语言实现数据结构之归并排序相关推荐

  1. 数据结构源码笔记(C语言):二路归并排序

    //实现二路归并排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20 //线性表中最多元素个数typedef int ...

  2. 【数据结构(C语言)】数据结构-内部排序

    内部排序 文章目录 内部排序 一.概述 (1)排序定义 (2)稳定性 (3)内部排序和外部排序 (4)两种基本操作 (5)数据类型定义 二.分类 (1)插入排序 (2)交换排序 (3)选择排序 (4) ...

  3. 考研专业课c语言与数据结构,南开大学816 C语言与数据结构2018考研专业课大纲...

    南开大学816 C语言与数据结构2018考研专业课大纲 2017-09-29 14:41 | 考研集训营 南开大学2018考研专业课大纲已经公布,每个学校自专业课考试大纲及专业课考试内容不一样,小编会 ...

  4. 13:Scala语言的数据结构和算法

    第十九章 Scala语言的数据结构和算法 19.1 数据结构(算法)的介绍 数据结构的介绍   1.数据结构是一门研究算法的学科,只从有了编程语言也就有了数据结构.学好数据结构可以编写出更加漂亮.更加 ...

  5. 大数据技术之_16_Scala学习_13_Scala语言的数据结构和算法_Scala学习之旅收官之作

    大数据技术之_16_Scala学习_13 第十九章 Scala语言的数据结构和算法 19.1 数据结构(算法)的介绍 19.2 看几个实际编程中遇到的问题 19.2.1 一个五子棋程序 19.2.2 ...

  6. 有考c语言的软件工程专硕吗,软件工程 专硕《C语言与数据结构》-考试大纲.doc...

    附件7: <C语言与数据结构>之C语言部分考试大纲 一.考试目的 本考试是硕士学位研究生的入学资格考试.招生院校根据考生参加本考试的成绩来选择参加第二轮,即复试的考生. 二.考试的范围 三 ...

  7. 算法java语言描述_java语言描述数据结构与算法崔笑颜的博客

    java语言描述数据结构与算法崔笑颜的博客 冒泡排序 插入排序 选择排序 希尔排序 快速排序 归并排序 二分查找package com.demo.test; import java.util.Arra ...

  8. C语言 带比较器的归并排序

    1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int DataType; 5 6 //比较器 7 int myc ...

  9. c语言仓库管理系统链表,仓库管理系统 C语言 C++ 数据结构 链表 课程设计

    仓库管理系统 C语言 C++ 数据结构 链表 课程设计 #include #include #include #include #define MAX 64 typedef struct node{ ...

最新文章

  1. eclipse工程中查看android源码
  2. 创建型设计模式(单例模式)
  3. Python-sys.argv[]用法
  4. 极客招募令!兄弟杯区块链极客竞技大赛在上海等您来战!
  5. 创建线程的三种方法_Netty源码分析系列之NioEventLoop的创建与启动
  6. thinkphp回调的php调用db类,请问thinkphp中model类自动完成功能 回调函数能不能获取其他字段的值?...
  7. Pytho——装饰器五大实例
  8. C++隐式类类型转换
  9. Hadoop源码分析28 JobTracker 处理JobClient请求
  10. Python使用Telnetlib模块实现telnet远程操作
  11. PLSQL设置字体大小
  12. Java 那些你不知道的爬虫反爬虫套路
  13. Centos7.9最小化安装与初始化环境配置
  14. ​趣约会接入珍爱网风控系统,安全成婚恋交友“护城河”
  15. 人民币在岸 离岸 中间价的含义与关系
  16. PTA旅游规划(迪杰斯特拉算法)
  17. UEditor .Net版本任意文件上传漏洞复现总结
  18. 微软oneDrive网站打不开
  19. 仿win10源码php,仿Windows10日历
  20. SAP PA培训总结

热门文章

  1. svg齿轮动画js特效
  2. 操作系统学习笔记(5. 文件管理)
  3. SQL Server代理(已禁用代理XP) 出现的原因以及解决方法【通俗易懂,简洁明了】
  4. Unity 基于PDFViewer制作读取横板PDF,改为横向滑动读取并做自适应(可网络同步)
  5. ubuntu下没有中文输入法的解决办法!
  6. O32 对接 交易所报盘软件_沈阳企业“新”社保报盘软件(下载地址)!
  7. 线索二叉树的线索化、及遍历
  8. 使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)
  9. 利用C,C++的宏,获取变量名!
  10. 微信小程序7个步骤告诉你怎么投放广告位