zoukankan      html  css  js  c++  java
  • 分治法 -- 排序

    1. 原因

    今天在用lua对一组数据进行排序,想起来很久没有写过算法了,工作中对于数据进行排序时都是使用STL里面的函数,比如sortqsort这些函数。忽然兴致勃勃的想写一个算法,表示自己没有完全忘记算法内容,所以选了一个比较简单的排序功能 -- 分治法排序

    2. 分治算法的解题步骤

    1.分治 -- 把元问题分割成相同的子问题,这步其实就是把问题的空间大小变小,比如本来要对10个数进行排序,我们把他分割成2组,每组5个进行排序(通常用递归的形式来分解问题)
    2.子问题的解决: 比如上面的排序,就是把分割后的5个数进行排序
    3. 合并:把子问题的结果进行合并

    3. 废话不多说了,虽然代码很挫,但是先上一个。验证上面的解题步骤

    // 2: 子问题解决
    void merge(int a[], int l, int m, int r)
    {
    	int l_len = m - l + 1;
    	int r_len = r - m;
    	int *l_a = new int[l_len];
    	memset(l_a, 0x00, l_len * sizeof(int));
    	int *r_a = new int[r_len];
    	memset(r_a, 0x00, r_len * sizeof(int));
    	for (int i = 0; i < l_len; ++i)
    	{
    		l_a[i] = a[l + i];
    	}
    	for (int i = 0; i < r_len; ++i)
    	{
    		r_a[i] = a[m + i + 1];
    	}
    
    	int l_i = 0;
    	int r_i = 0;
    	for (int i = l; i <= r; ++i)
    	{
    		if(r_i >= r_len)
    		{
    			a[i] = l_a[l_i++];
    		}
    		else if (l_i >= l_len)
    		{
    			a[i] = r_a[r_i++];
    		}
    		else if (l_a[l_i] <= r_a[r_i])
    		{
    			a[i] = l_a[l_i++];
    		}
    		else
    		{
    			a[i] = r_a[r_i++];
    		}
    	}
    
    	delete []l_a;
    	delete []r_a;
    }
    
    // 1:分治
    // 3:分治的结束返回其实就是子问题的合并
    void mergerSort(int a[], int l, int r)
    {
    	if (l < r)
    	{
    		int m = (l + r) / 2;
    		mergerSort(a, l, m);
    		mergerSort(a, m + 1, r);
    		merge(a, l, m, r);
    	}
    }
    
    // 测试用例
    int a[] = { 23, 4, 5, 43, 2 };
    mergerSort(a, 0, 4);
    
  • 相关阅读:
    Net框架下的XSLT转换技术简介
    ASP.NET单点登录(代码)
    IE直接下载汇总
    获取客户端网卡MAC地址和IP地址的几种方法(一)
    .NET专区用ASP.Net获取客户端网卡的MAC
    C#枚举系统安装的所有打印机
    Div+CSS布局入门教程
    动态加载JS脚本的4种方法
    WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息,所在城市
    股票中的名词解释
  • 原文地址:https://www.cnblogs.com/zjzyh/p/5531383.html
Copyright © 2011-2022 走看看