写归并排序作业时候发现自己对递归有好多遗忘。
现对递归进行以下复习和总结:
- 归并排序利用的是分治的思想,“分治”即把复杂的问题分成简单的问题进行求解。
- 总的来说呢:分治是一种求解复杂问题的思想,而递归呢,就为其提供了求解的方法。
先说一下递归:
- 简单来说递归就是自己调用自己。递归关系就是实体自己和自己建立关系。
- 递归的条件:
(1)子问题与原问题需一致,且更简单。
(2)递归必须要有出口,不然就永远出不来了。
接下来我们用归并排序更加深入理解递归:
- 归并排序大致思想很简单:即先划分,再合并。
每次都一分为二,这样划分什么时候到头呢?
答:这样想,我们最终要得到的是一个排好序的大数组,子问题就是需要得到排好序的一个个小数组,小数组什么时候有序呢,当数组中就只有一个元素时候,则小数组就有序了。这样我们就得到了递归的条件即 low<high.
直接上图:
其实我当时也是,老师上课讲的思想也都懂,就是有始终不太明白他是怎么合并就有顺序了,这也是我递归遗忘的诟病。
我写的代码MERGE是合并并排序两个小数组的。(后面有代码)
其实了解了递归的步骤后很容易:继续上图:
↑
代码↓
#include <stdio.h>
#include <stdlib.h>
#define N 1000000
void Mergesort(int *A,int low,int high,int *temp)
{
if(low < high)
{
int mid = (high+low)/2;
Mergesort(A