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

  • 相关阅读:
    团队第三次作业-王者终篇
    第二次团队任务之个人
    团队作业总和
    本次分工
    【软件工程】第一次作业
    面向对象第三次作业(向计算器进发)
    面向对象程序设计第二次作业(1)
    面向对象程序设计第二次作业(2)
    我的大一上(福州)
    第一周例行报告
  • 原文地址:https://www.cnblogs.com/stul/p/10478919.html
Copyright © 2011-2022 走看看