前言
简要记录一下自己的学习算法的思路吧!
一、什么是分治思想?
在介绍归并排序前,我们先来了解一下实现归并排序的中心思想。分治思想简单来说就是,将原来的大规模问题分解成n个小规模的子问题,然后分别对这n个问题进行求解。这n个问题可以具有相同求解操作,也可以是相互独立的子问题。(具体的分治思想,看其他有关的解释,这里只作简单介绍。)
二、如何使用分治思想实现归并排序?
1.设计归并排序的步骤
- 分解。将一段无序序列进行分解,对于分解后的每一个部分继续分解直到问题足够简单。也就是说,将序列不断的分为两部分(使用递归)直到每一个小序列(分解后的每一个小部分)都只有一个数,因为一个数作为一个序列必定有序,所以该情况为最简问题。
- 合并。经过分解后每一段序列必定有序,所以只需要合并就好了。但是合并两个有序序列时,需要对两个序列的数字进行比较,判断优先入列的元素。
具体操作如下:
2.归并排序代码实现
代码如下:
/*
归并排序
*/
#include<iostream>
using namespace std;
const int N = 1005;
void Meger(int* a, int l, int mid, int r)
{
int b[N];
int i = l, j = mid + 1, t = 0;
//对两个序列的数字一一比较,大的先入序列b(暂时序列)
while (i <= mid && j <= r)
{
if (a[i] > a[j])b[t++] = a[j++]; //小的先入队列b
else b[t++] = a[i++]; //默认为前半段队列先入
}
//将未完全入队列的全部放入
while (i <= mid)b[t++] = a[i++];
while (j <= r)b[t++] = a[j++];
//将排好序的数放回原数组
for (int i = 0; i < t; i++)a[i + l] = b[i];
}
void Megersort(int* a, int l, int r)
{
if (l < r) //如果序列仅有一个数就不需要分
{
//将数组分为各个有序序列
int mid = (l + r) >> 1;
Megersort(a, l, mid);
Megersort(a, mid + 1, r);
//合并
Meger(a, l, mid, r);
}
}
int main()
{
//创建一个数组
int arr[11] = { 7, 3, 6, 2, 4, 1, 5, 5, 9, 10, 1 };
//排序
Megersort(arr, 0, sizeof(arr) / sizeof(int) - 1);
//输出
for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
总结
第一次写博客,写的不是很好,希望看见这篇文章的大佬们能够慷慨的给予一些意见。
之所以尝试写博客,是因为听从师兄的建议尝试通过这种方式来加强自己的理解和记忆。