zoukankan      html  css  js  c++  java
  • 归并排序理解递归

    https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F

    先上一个网站,这个 网站最好看看。

    点开之后可以看到归并排序的动态演示图,只要能理解这个图,就能够理解递归和归并排序了。

    你可以看到图里面的数分了四层,然后变成八个数,但是每两个数是一个递归里面的,所以先从第一个和第二个数开始归并,归并的时候比较大小,归并完之后,这是这个小递归的结束,然后这层总共有四个小递归,依次执行完即可。

    然后才是第三层递归的执行,因为已经分过了,所以只执行归并,然后再去执行之前的递归。

    #include <iostream>
    using namespace std;
    int a[10]={13,17,15,20,22,23,30,28,40,10};
    int b[10]; 
    
    void Merge(int a[],int s,int m,int e,int tmp[])
    {
    	int pb=0;
    	int p1=s;
    	int p2=m+1;
    	while (p1<=m&&p2<=e) {
    		if (a[p1]>a[p2]) {
    			tmp[pb++]=a[p2++];
    		}
    		else {
    			tmp[pb++]=a[p1++];
    		}
    	}	
    	while (p1<=m) {
    		tmp[pb++]=a[p1++];
    	}
    	while (p2<=e) {
    		tmp[pb++]=a[p2++];
    	}
    	for (int i=0;i<e-s+1;i++) {
    		a[s+i]=tmp[i];
    	}
    }
    
    void MergeSort(int a[],int s,int e,int tmp[])
    {
    	if (s<e) {
    		int mid=s+(e-s)/2;
    		MergeSort(a,s,mid,tmp);
    		MergeSort(a,mid+1,e,tmp);
    		Merge(a,s,mid,e,tmp);
    	}
    }
    
    int main()
    {
    	int size=sizeof(a)/sizeof(int);
    	MergeSort(a,0,size-1,b);
    	for (int i=0;i<size;i++)
    	{
    		cout<<a[i]<<" ";
    	}
    	cout<<endl;
    	return 0;
    }
  • 相关阅读:
    meanshift聚类的实现
    birch聚类算法
    DBSCAN聚类算法的实现
    discrete adaboost的C++实现
    kd-tree的实现
    红黑树的实现——插入
    24位位图转8位灰度图
    将RGB数据写入BMP位图文件
    splay树的实现
    AVL树的实现
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/10211364.html
Copyright © 2011-2022 走看看