• 快速排序


    归并排序也是基于分治法的。归并排序将待归并元素序列分为两个长度相等的子序列,为每一个子序列排序。然后再将他们合并成一个序列。合并两个子序列的过程称为两路归并。

    编程经验:

    1、快速解决问题法宝:1、最简单情况,画图分析,纸上执行;2、单步调试,快速查错。

    2、程序顺便编译,所以后面函数中要用到前面函数的话,那个被依赖函数要先写。

    /*
    划分函数:
    */

    void MergeSort(int *copy,int *orign,int start,int end)
    {
    	if(start<end)	//如果子序列的长度大于1
    	{
    		int mid=(start+end)/2;	//2路归并,漏写2
    		MergeSort(copy,orign,start,mid);	//递归划分左子序列
    		MergeSort(copy,orign,mid+1,end);	//递归划分右子序列
    		Merge(copy,orign,start,mid,end);	//合并当前划分
    	}
    }
    

    /*
    排序函数:
    1、需要一个copy数组存放每次划分后,左右子序列的元素,然后归并到原数组中。
    */

    void Merge(int *copy,int *orign,int start,int middle,int end )
    {
    	//创建辅助数组
    	for(int i=start;i<=end;i++)
    		copy[i]=orign[i];		//赋值左右归并后的数组到辅助数组
    
    	int wg1=start,wg2=middle+1,t=start;				//分别用来监视左右子序列和归并后的数组序列
    	while(wg1<=middle&&wg2<=end)
    	{
    		//当其中的每个数组都还有元素时,则需要比较左右两个序列的彼此大小
    		if(copy[wg1]<copy[wg2])
    			orign[t++]=copy[wg1++];
    		else
    			orign[t++]=copy[wg2++];
    	}
    	//上述操作导致其中的某个子序列肯定被执行完,未执行完的子序列已经有序,只需要原样复制
    	while(wg1<=middle)
    		orign[t++]=copy[wg1++];
    	while(wg2<=end)
    		orign[t++]=copy[wg2++];
    
    	//如此就可归并当前划分的两个有序序列
    }
    

    主程序:

    int _tmain(int argc, _TCHAR* argv[])
    {
    	//编程经验:递归树可帮助理解,从最简单情况辅助分析
    	//程序顺便编译,所以后面函数中要用到前面函数的话,那个被依赖函数要先写
    	//快速解决问题法宝:1、最简单情况,画图分析,纸上执行;2、单步调试,快速查错
    	int orgin[8]={21,25,49,16,17,8,31,41};
    	int copy[8];
    	//归并函数
    	void Merge(int *copy,int *orign,int start,int middle,int end );
    	//划分函数
    	void MergeSort(int *copy,int *orign,int start,int end);
    
    	cout<<"----------------归并排序算法---------"<<endl;
    	//测试
    	MergeSort(copy,orgin,0,7);	//注意数组下标
    	for(int i=0;i<8;i++)
    		cout<<orgin[i]<<" ";
    	cout<<endl;
    
    	return 0;
    }
    

    测试结果:

    ----------------归并排序算法---------
    8 16 17 21 25 31 41 49
    请按任意键继续. . .

  • 相关阅读:
    关于Linux内核版本
    什么是操作系统?
    进程三种基本状态
    Repo实践指南
    在TortoiseSVN/TortoiseGit中使用BeyondCompare进行差异对比
    Redis安装
    Outlook配置163邮箱
    Nginx安装
    MySQL字符串操作函数
    Java各种反射性能对比
  • 原文地址:https://www.cnblogs.com/fistao/p/3080708.html
Copyright © 2020-2023  润新知