归并排序

今天我们来学一种新的排序方法:归并排序 ,首先我们来看一个问题:如何将下面的数组从小到大排序好: 5,1,3,0,5,4,9,8,7,0 这里我们采用新的方法,归并排序。首先我们先来看看它的思路:

  1. 首先根据每次递归得到的数组由两个相邻的排列好的序列组成,其中有个指针指向数组中间。
  2. 分别有两个指针指向两个序列,第一个指针指向第一个序列第一个元素,第二个指针指向第二个序列第一个元素。将第一个指针指向的数和第二个指针指向的数对比,哪个小就赋予给一个临时存放数据的数组tmp[10],被拿走数据的指针向前走一步,以此类推,反复判断,直至一边到达终点。当一边到达终点后,将剩下没有到达终点的一方后面元素全部再临时数组后面。
  3. 将排好顺序的临时数组内容赋给原来数组。

下面为一次判断的图示: alt

在这里插入图片描述

然后就是关于如何将一个任意的数组递归成最后一部是两个有序数列。

下面我画了有关程序执行的流程,关于它如何多次反复递归的内部实现 从进入函数到取到最底层:

在这里插入图片描述

得到底层元素后,开始反向执行每一次排序:

在这里插入图片描述

完整代码如下:

//归并排序
#include<stdio.h>

int tmp[10] = { 0 };

void merge_sort(int q[], int l, int r)
{
	if (l >= r)
		return ;
	int mid = l + r >> 1;
	//递归排好数据
	merge_sort(q, l, mid), merge_sort(q, mid+1, r);
	int k = 0, i = l, j = mid + 1;
	//指针递增
	while (i <= mid && j <= r)
	{
		if (q[i] <= q[j]) tmp[k++] = q[i++];
		else tmp[k++] = q[j++];
	}
	//当一边到界,而令一边指针未到界
	while (i <= mid) tmp[k++] = q[i++];
	while (j <= r) tmp[k++] = q[j++];
	//数据赋给数组
	for (i = l, j = 0; i <=r;i++,j++)
	{
		q[i] = tmp[j];
	}
}


int main()
{
	int arr[10] = { 5,1,3,0,5,4,9,8,7,0};
	merge_sort(arr, 0, 9);
	for (int i = 0; i < 10; i++)
		printf("%d ", arr[i]);
	return 0;
}
全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务