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函数注释。

  • 相关阅读:
    三数之和
    罗马数字与整数
    Oracle 开启或关闭归档
    Oracle RMAN scripts to delete archivelog
    Oracle check TBS usage
    Oracle kill locked sessions
    场景9 深入RAC运行原理
    场景7 Data Guard
    场景4 Data Warehouse Management 数据仓库
    场景5 Performance Management
  • 原文地址:https://www.cnblogs.com/stul/p/10478919.html
Copyright © 2011-2022 走看看