2020/12/5 归并排序

归并排序和快排猎豹网校的讲的不好,他用的是技巧,比如给数组多加一个元素之类的,但是我要学通用的方法之后再学技巧。

  1. 快速排序将无序的元素序列分成两个无序的元素序列的过程中,很有可能是不稳定的(大小西相同的数据排序完相对位置发生了改变)
  2. 寻找一个即突破O(n2)又是稳定的算法,归并算法为了变成一个稳定的算法,他牺牲了空间,把有序的序列考到了一个新的序列里面。
  3. 多路归并:将多个有序的序列合成一个有序的序列
#include <iostream>
#include <algorithm>
#define MAXSIZE 1000
using namespace std;
void swap(int array[], int i, int j)
{
	int temp = array[i];
	array[i] = array[j];
	array[j] = temp;
}
void Merge(int src[], int des[], int low, int mid, int high)
//归并的过程
//src是数组,des是目的地
{
	int i = low;
	int j = mid + 1;
	int k = low;
	while ((i <= mid) && (j <= high))//将小的放到目的地中
		//这个如果没有等于号就不是稳定排序
	{
		if (src[i] < src[j]) des[k++] = src[i++];
		else des[k++] = src[j++];
	}
	while (i <= mid)//若还剩几个尾部元素
		des[k++] = src[i++];
	while (j <= high)//若还剩几个尾部元素
		des[k++] = src[j++];

}

//每次兵分两路,当只剩下一个元素时,就不需要再划分
void Msort(int src[], int des[], int low, int high, int max)
//划分的过程
{
	if (low == high)//只有一个元素,不用归并,结果赋给des[low]
		des[low] = src[low];
	else  //如果两个元素,进行二路划分
	{
		int mid = (low + high) / 2;
		int TR2[MAXSIZE+1];//辅助数组

		//递归进行两路两路的划分
		//当剩下一个元素的时候,递归划分结束,然后开始merge归并操作
			Msort(src, TR2, low, mid, max);
			Msort(src, TR2, mid + 1, high, max);
			Merge(TR2, des, low, mid, high);//调用归并函数进行归并
	}
}
void MergeSort(int array[], int len)
{
	Msort(array, array, 0, len - 1, len);
	//Msort(原数组,目标数组,原数组中的最低位和最高位,长度)
}
int main()
{
	int array[] = { 12, 5, 433, 7, 98, 32, 11, 8, 2, 56 };
	int len = sizeof(array) / sizeof(*array);
	cout << "before sorting:" << endl;
	for (int i = 0; i <len; ++i)
	{
		cout << array[i] << " ";
	}
	cout << endl;

	MergeSort(array, len);

	cout << "after sorting:" << endl;
	for (int i = 0; i <len; ++i)
	{
		cout << array[i] << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}


比较好的参考:

https://blog.csdn.net/li528405176/article/details/86615003?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.not_use_machine_learn_pai

https://www.jianshu.com/p/591b96c32cc8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值