C语言归并排序(合并排序)

归并排序也称合并排序,其算法思想是将待排序序列分为两部分,依次对分得的两个部分再次使用归并排序,之后再对其进行合并。仅从算法思想上了解归并排序会觉得很抽象,接下来就以对序列A[0], A[l]…, A[n-1]进行升序排列来进行解说,在此采用自顶向下的实现方法。

操作步骤

(1)将所要进行的排序序列分为左右两个部分,如果要进行排序的序列的起始元素下标为first,最后一个元素的下标为last,那么左右两部分之间的临界点下标mid=(first+last)/2,这两部分分别是A[first … mid]和A[mid+1 … last]。

(2)将上面所分得的两部分序列继续按照步骤(1)继续进行划分,直到划分的区间长度为1。

(3)将划分结束后的序列进行归并排序,排序方法为对所分的n个子序列进行两两合并,得到n/2或n/2+l个含有两个元素的子序列,再对得到的子序列进行合并,直至得到一个长度为n的有序序列为止。

示例归并排序

#include <stdio.h>
#include <stdlib.h>
#define N 7void merge(int arr[], int low, int mid, int high){int i, k;int *tmp = (int *)malloc((high-low+1)*sizeof(int));//申请空间,使其大小为两个int left_low = low;int left_high = mid;int right_low = mid + 1;int right_high = high;for(k=0; left_low<=left_high && right_low<=right_high; k++){  // 比较两个指针所指向的元素if(arr[left_low]<=arr[right_low]){tmp[k] = arr[left_low++];}else{tmp[k] = arr[right_low++];}}if(left_low <= left_high){  //若第一个序列有剩余,直接复制出来粘到合并序列尾//memcpy(tmp+k, arr+left_low, (left_high-left_low+l)*sizeof(int));for(i=left_low;i<=left_high;i++)tmp[k++] = arr[i];}if(right_low <= right_high){//若第二个序列有剩余,直接复制出来粘到合并序列尾//memcpy(tmp+k, arr+right_low, (right_high-right_low+1)*sizeof(int));for(i=right_low; i<=right_high; i++)tmp[k++] = arr[i];}for(i=0; i<high-low+1; i++)arr[low+i] = tmp[i];free(tmp);return;
}void merge_sort(int arr[], unsigned int first, unsigned int last){int mid = 0;if(first<last){mid = (first+last)/2; /* 注意防止溢出 *//*mid = first/2 + last/2;*///mid = (first & last) + ((first ^ last) >> 1);merge_sort(arr, first, mid);merge_sort(arr, mid+1,last);merge(arr,first,mid,last);}return;
}int main(){int i;int a[N]={32,12,56,78,76,45,36};printf ("排序前 \n");for(i=0;i<N;i++)printf("%d\t",a[i]);merge_sort(a,0,N-1);  // 排序printf ("\n 排序后 \n");for(i=0;i<N;i++)printf("%d\t",a[i]); printf("\n");system("pause");return 0;
}

运行结果:
排序前

32    12    56    78    76    45    36

排序后

12    32    36    45    56    76    78

上述程序通过归并排序成功地实现了对给定序列的排序操作。

归并排序流程图

在这里插入图片描述

上图所示,先对所要进行排序的序列进行分解,直到分为单个元素为止,然后将其进行两两合并。由于最终分解成单个元素,因此在合并的时候.将小数放在前面,大数放在后面,得到一个有序序列。接下来对两个相连的有序序列进行排序,先比较有序序列中的第一个元素,将较小的元素放入临时数组中,接着将较小元素所在数组的下一个元素与另一个数组中的较小元素比较,同样将较小元素放入临时数组中,依次进行,直到两个数组的所有元素都放入临时数组中,最后再将临时数组的元素放入原始数组中的对应位置。

扫一扫更精彩哟!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础(14)之 类和对象

目录 Python类和对象 一、创建类 二、创建对象 三、init() 函数 四、对象方法 五、自参数 六、对象及其属性更改 七、pass语句 Python类和对象 Python 类/对象。Python 是一种面向对象的编程语言。Python 中的几乎所有东西都是一个对象&#xff0c;有它的属性和方法。…

C语言顺序查找

顺序査找是一种简单的査找算法&#xff0c;其实现方法是从序列的起始元素开始&#xff0c;逐个将序列中的元素与所要查找的元素进行比较&#xff0c;如果序列中有元素与所要查找的元素相等&#xff0c;那么査找成功&#xff0c;如果査找到序列的最后一个元素都不存在一个元素与…

python基础(15)之 继承

目录 Python继承 一、创建父类 二、创建子类 三、添加 init() 函数 四、使用 super() 函数 五、添加属性 六、添加方法 Python继承 继承允许我们定义一个从另一个类继承所有方法和属性的类。父类是被继承的类&#xff0c;也称为基类。子类是从另一个类继承的类&#xff…

C语言二分查找(折半查找)

二分査找也称折半査找&#xff0c;其优点是查找速度快&#xff0c;缺点是要求所要査找的数据必须是有序序列。该算法的基本思想是将所要査找的序列的中间位置的数据与所要査找的元素进行比较&#xff0c;如果相等&#xff0c;则表示査找成功&#xff0c;否则将以该位置为基准将…

python基础(16)之 日期

目录 Python日期 一、日期输入输出 二、创建日期对象 三、strftime() 方法 Python日期 Python 中的日期不是它自己的数据类型&#xff0c;但我们可以导入一个名为的模块datetime来处理日期作为日期对象。 一、日期输入输出 导入 datetime 模块并显示当前日期&#xff1a;…

python基础(17)之 JSON

Python JSON JSON 是一种用于存储和交换数据的语法。JSON 是文本&#xff0c;用 JavaScript 对象表示法编写。 Python 有一个名为 的内置包json&#xff0c;可用于处理 JSON 数据。 导入 json 模块&#xff1a; import json一.从 JSON 转换为 Python 如果您有 JSON 字符串&am…

python基础(18)之 异常处理

目录 异常处理 一、异常处理 二、else搭配 三、finally语句 四、引发异常 异常处理 try块可让您测试代码块的错误。except块可让您处理错误。finally无论 try- 和 except 块的结果如何&#xff0c;该块都允许您执行代码。 一、异常处理 例如该try块将产生异常&#xff0…

python基础(19)之 输入输出

目录 用户输入 一、格式化输入输出 二、格式化字符串字面值 三、字符串 format() 方法 四、手动格式化字符串 五、旧式字符串格式化方法 用户输入 实在太简单了&#xff0c;就是使用一个input(),将输入后的值传递给另一个变量&#xff0c;相当于动态赋值、 例如&#xff…

C语言函数返回值详解

函数的返回值是指函数被调用之后&#xff0c;执行函数体中的代码所得到的结果&#xff0c;这个结果通过 return 语句返回。 return 语句的一般形式为&#xff1a; return 表达式;或者&#xff1a; return (表达式);有没有( )都是正确的&#xff0c;为了简明&#xff0c;一般…

机器学习之线性回归(python)

目录 一、基本概念 二、概念的数学形式表达 三、确定w和b 1.读取或输入数据 2.归一化、标准化 2.1 均值 2.2 归一化 2.3 标准化 3.求解w和b 1.直接解方程 2.最小二乘法&#xff08;least square method&#xff09;求解&#xff1a; 4. 评估回归模型 四、sklearn中…

C语言函数的调用

函数调用&#xff08;Function Call&#xff09;&#xff0c;就是使用已经定义好的函数。 函数调用的一般形式为&#xff1a; functionName(param1, param2, param3 ...);functionName 是函数名称&#xff0c;param1, param2, param3 …是实参列表。实参可以是常数、变量、表…

机器学习之线性回归(matlab)

目录 一、基本概念 二、概念的数学形式表达 三、确定w和b 1.读取或输入数据 2.归一化、标准化 2.1 均值 2.2 归一化 2.3 标准化 3.求解w和b 1.直接解方程 2.最小二乘法&#xff08;least square method&#xff09;求解&#xff1a; 4. 评估回归模型 四、regress线…

C语言函数声明以及函数原型

C语言代码由上到下依次执行&#xff0c;原则上函数定义要出现在函数调用之前&#xff0c;否则就会报错。但在实际开发中&#xff0c;经常会在函数定义之前使用它们&#xff0c;这个时候就需要提前声明。 函数声明&#xff08;Declaration&#xff09;&#xff0c;就是告诉编译…

python(20)之读写文件

目录 读写文件 1.简单介绍 2.从文件中读取单行数据 3.从文件中读取多行 4.把 string&#xff08;字符串&#xff09; 的内容写入文件 5.写入其他类型的对象 本节知识总结 mode 参数 file 对象 读写文件 1.简单介绍 最常用的参数有两个: open(filename, mode) f op…

C语言全局变量和局部变量深入

局部变量 定义在函数内部的变量称为局部变量&#xff08;Local Variable&#xff09;&#xff0c;它的作用域仅限于函数内部&#xff0c; 离开该函数后就是无效的&#xff0c;再使用就会报错。 示例 int f1(int a){int b,c; //a,b,c仅在函数f1()内有效return abc; } int ma…

python实例之 67,68

目录 67.题目&#xff1a;输入数组&#xff0c;最大的与第一个元素交换&#xff0c;最小的与最后一个元素交换&#xff0c;输出数组。 68.题目&#xff1a;有 n 个整数&#xff0c;使其前面各数顺序向后移 m 个位置&#xff0c;最后 m 个数变成最前面的 m 个数 今天这个不知道…

C语言块级变量

代码块&#xff0c;就是由{ }包围起来的代码。代码块在C语言中随处可见&#xff0c;例如函数体、选择结构、循环结构等。不包含代码块的C语言程序根本不能运行&#xff0c;即使最简单的C语言程序也要包含代码块。 C语言允许在代码块内部定义变量&#xff0c;这样的变量具有块级…

python实例 69,70

69.题目&#xff1a;有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 先看一下第一种实现方式 nmax 50 n int(input(请输入总人数:)) num [] f…

C语言递归调用

一个函数在它的函数体内调用它自身称为递归调用&#xff0c;这种函数称为递归函数。执行递归函数将反复调用其自身&#xff0c;每调用一次就进入新的一层&#xff0c;当最内层的函数执行完毕后&#xff0c;再一层一层地由里到外退出。 递归函数不是C语言的专利&#xff0c;Java…

python实例 71,72

目录 71.编写input()和output()函数输入&#xff0c;输出5个学生的数据记录。 72.题目&#xff1a;创建一个列表。 71.编写input()和output()函数输入&#xff0c;输出5个学生的数据记录。 #71 N 3 #stu # num : string # name : string # score[4]: list student [] for i…