zoukankan      html  css  js  c++  java
  • 分治法——归并排序(mergesort)

    首先上代码。

    #include <iostream>
    using namespace std;
    
    int arr[11];
    /*两个序列合并成一个序列。一共三个序列,所以用 3 根指针来处理。
    	i 是 low 到 mid 这个序列下标  序列 1 
    	j 是 mid+1 到 high 这个序列下标  序列 2 
    	k 代表新序列的下表  序列 3 
    */
    void merge(int a[], int low, int mid, int high)
    {
    	int i = low, j = mid+1, k =low;
    	int b[11];//这里直接开大一点。省事
    	
    	/*把序列 1 和序列 2 里面小的元素先放进序列 3 */ 
    	while(i <= mid && j <= high)
    		if(a[i] <= a[j]) b[k++] = a[i++];  
    		else b[k++] = a[j++];
    		
    	/*如果序列 2 的元素先消耗完,那就把序列 1 里面的所有元素放进序列 3*/	
    	while(i <= mid)
    		b[k++] = a[i++];
    	/*如果序列 1 的元素先消耗完,那就把序列 2 里面的所有元素放进序列 3*/ 
    	while(j <= high)
    		b[k++] = a[j++];
         /*把序列 3 赋值给原来的序列*/ for(int i = low; i <= high; i++) a[i] = b[i]; } void mergesort(int a[], int low, int high) { int mid; if(low < high) { mid = (low + high)/2; mergesort(a,low,mid);//递归划分序列 mergesort(a,mid+1,high); merge(a,low,mid,high); } } int main() { for(int i = 1; i <= 10; i++) scanf("%d",&arr[i]); mergesort(arr,1,10); for(int i = 1; i <= 10; i++) cout<<arr[i]<<" "; cout<<" "; return 0; }

     分治法一般分为三个步骤。1.分 2.治 3.合并。归并排序也是分治的思想,所以它也可以分为三步。

    1.分。将大序列划为两个小序列(当然也可以多个)。一直划分到序列只有 1 个元素的时候停止。

    2.治。因为停止时候序列元素只有 1 个,所以治这一步是没有体现出来的。

    3.合并。这是归并排序的主要步骤。合并是将两个序列合并为一个有序序列。具体怎么合并,可以参考merge函数注释。

  • 相关阅读:
    NavigationBar隐藏
    (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
    Makefile 中:= ?= += =的差别 和条件运行
    C# 使用WinRar命令压缩和解压缩
    C# 字段、属性、成员变量
    js中推断对象详细类型
    Python学习入门基础教程(learning Python)--3.3.3 Python逻辑关系表达式
    JavaScript类数组对象参考
    Codeforces Round 190 div.2 322C 321A Ciel and Robot
    Android Application plugin
  • 原文地址:https://www.cnblogs.com/stul/p/10478919.html
Copyright © 2011-2022 走看看