body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

归并排序(Merging Sort):归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
  原理:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n除以2向上取整个长度为2或1的有序子序列;两两归并,直到得到一个长度为n的有序序列为止。
#include<iostream>
using namespace std;
//归并排序,先数组细分为单个,在合并
int mergeArr(int* arr,int first,int mid,int last);
int mergeSort(int* arr,int first,int last);  //递归实现
int mergeSortIterator(int* arr,int first,int last);  //非递归实现
void swap(int& elem1,int& elem2);
void test();
void printArr(int* arr,int length);
int mergeArr(int* arr,int first,int mid,int last)
{
        if(NULL==arr||first>last||first>mid||mid>last||first<0||mid<0||last<0)
                return -1;
        int len = last - first +1;
        int* tmpArr = new int[len]();
        int firIdx = first,lasIdx = mid + 1;
        int idx = 0;
        while(firIdx<=mid&&lasIdx<=last)
        {
                if(arr[firIdx]<arr[lasIdx])
                        tmpArr[idx++] = arr[firIdx++];
                else
                        tmpArr[idx++] = arr[lasIdx++];
        }
        while(firIdx<=mid)
                tmpArr[idx++] = arr[firIdx++];
        while(lasIdx<=last)
                tmpArr[idx++] = arr[lasIdx++];
        for(int iidx=first,idx=0;iidx<=last;++iidx)
                arr[iidx] = tmpArr[idx++];
        delete []tmpArr;
        return 0;
}
int mergeSort(int* arr,int first,int last)
{
        if(NULL==arr||first<0||last<0||first>last)
                return -1;
        int mid = (first + last)/2;
        if(first<last)  //划分为只有一个元素
        {
                mergeSort(arr,first,mid);
                mergeSort(arr,mid+1,last);
        }
        //合并
        mergeArr(arr,first,mid,last);
        return 0;
}
int mergeSortIterator(int* arr,int first,int last)
{
        if(NULL==arr||first<0||last<0||first>last)
                return -1;
        //非递归,直接合并
        for(int idx=1;idx<=last;idx*=2)  //都是两两合并,所以乘以2,最初从1开始,表示数组都划分为1的单个数组
        {
                int firstIdx = 0;
                while(firstIdx+idx<=last)
                {
                        int mid = firstIdx + idx -1;
                        //last有特殊情况,比如数组奇数个,最后会剩下一个元素
                        int lastIdx = mid + idx <= last ? mid + idx : last;
                        mergeArr(arr,firstIdx,mid,lastIdx);
                        firstIdx = lastIdx + 1;  //开始合并下一个子序列
                }
        }
        return 0;
}
void printArr(int* arr,int length)
{
        if(NULL==arr||length<=0)
                return ;
        for(int idx=0;idx!=length;++idx)
        {
                cout<<arr[idx]<<" ";
        }
        cout<<endl;
}
void test()
{
        int arr[] = {6,5,3,1,8,7,2,4};
        printArr(arr,8);
        mergeSort(arr,0,7);
        /*mergeSortIterator(arr,0,7);*/
        printArr(arr,8);
        cout<<endl;
        int arr1[] = {1,2,0,-1,5,6,8,3};
        printArr(arr1,8);
        mergeSort(arr1,0,7);
        /*mergeSortIterator(arr1,0,7);*/
        printArr(arr1,8);
        cout<<endl;
        int arr2[] = {2,2,2,2};
        printArr(arr2,4);
        mergeSort(arr2,0,3);
        //mergeSortIterator(arr2,0,3);
        printArr(arr2,4);
        cout<<endl;
        int arr3[] = {2,4,1};
        printArr(arr3,3);
        mergeSort(arr3,0,2);
        /*mergeSortIterator(arr3,0,2);*/
        printArr(arr3,3);
        cout<<endl;
        int arr5[] = {1,2,3,4,5,6,7,8};
        printArr(arr5,8);
        mergeSort(arr5,0,7);
        /*mergeSortIterator(arr5,0,7);*/
        printArr(arr5,8);
        cout<<endl;
        int* arr6 = NULL;
        printArr(arr6,4);
        mergeSort(arr6,0,3);
        /*mergeSortIterator(arr6,0,3);*/
        printArr(arr6,4);
        cout<<endl;
}
int main()
{
        test();
        system("pause");
}

//归并排序,原地归并,空间复杂度O(1)
//归并排序,一般的空间复杂度都是O(n),现在要O(1)
#include<iostream>
using namespace std;
void swap(int& a,int& b)
{
        int tmp = a;
        a = b;
        b = tmp;
        return ;
}
void reverse(int* arr,int len)  //len个元素的数组逆序
{
        if(NULL==arr)
                return ;
        int first = 0,end = len-1;
        while(first<end)
        {
                swap(arr[first++],arr[end--]);
        }
        return ;
}
void printArr(int* arr,int len)
{
        if(NULL==arr)
                return ;
        for(int idx=0;idx!=len;++idx)
        {
                cout<<arr[idx]<<" ";
        }
        cout<<endl;
        return;
}
void moveLeft(int* arr,int len,int cnt) //arr数组,长度len,左移cnt个元素
{
        if(NULL==arr||len<=0)
                return ;
        reverse(arr,cnt);    // 1 2 3 4 5 ,左移3个位置,arr,5,3
        reverse(arr+cnt,len-cnt);
        reverse(arr,len);
}
void mergeArr(int* arr,int first,int mid,int end)
{
        if(NULL==arr||first>end||mid>end)
                return ;
        int second = mid + 1;
        while(first<=mid&&second<=end)
        {
                int secondLow = 0;
                while( first<=mid && arr[first]<=arr[second] )
                        ++first;
                while( second<=end && arr[second]<=arr[first] )
                {
                        ++second;
                        ++secondLow;
                }
                moveLeft(arr+first,second-first,second - first - secondLow);
                first += secondLow;
        }
        return ;
}
void mergeSort(int* arr,int first,int end)
{
        if(NULL==arr)
                return;
        if(first<end)
        {
                int mid = (first + end)/2;
                mergeSort(arr,first,mid);
                mergeSort(arr,mid+1,end);
                //归并
                mergeArr(arr,first,mid,end);
        }
}
int main(int argc,char** argv)
{
        int arr[] = {6,4,3,1,7,8,2,9,5,0};
        mergeSort(arr,0,9);
        printArr(arr,10);
        system("pause");
}

归并排序(Merging Sort)的更多相关文章

  1. 数据结构 - 归并排序(merging sort)

    归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效 ...

  2. 数据结构 - 归并排序(merging sort) 具体解释 及 代码

    归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...

  3. 小小c#算法题 - 8 - 归并排序 (Merging Sort)

    “归并”的含义是将两个或两个以上的有序序列组合成一个新的有序序列.这个“归并”可以在O(n+m)的数量级上实现,但这同时也需要O(n+m)的空间复杂度.具体为:首先分配一个新的长度为n+m的空序列,然 ...

  4. FZU 1919 -- K-way Merging sort(记忆化搜索)

    题目链接 Problem Description As we all known, merge sort is an O(nlogn) comparison-based sorting algorit ...

  5. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  6. 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)

    连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...

  7. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...

  8. Simplest Python K-Way Merging Sort|最简单的Python k路归并排序

    想做这个好长时间了,因为有一篇Dreamworks的论文<Coherent Out-of-Core Point-Based Global Illumination>提到了这个,一直没时间做 ...

  9. 归并排序(merge sort)

    M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...

随机推荐

  1. CentOS 7系统安装配置图解教程

    操作系统:CentOS 7.3 备注: CentOS 7.x系列只有64位系统,没有32位.生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 一.安装CentOS ...

  2. 手工生成AWR报告方法记录

    AWR(Automatic Workload Repository)报告是我们进行日常数据库性能评定.问题SQL发现的重要手段.熟练掌握AWR报告,是做好开发.运维DBA工作的重要基本功. AWR报告 ...

  3. 机器学习与数据科学 基于R的统计学习方法(基础部分)

    1.1 机器学习的分类 监督学习:线性回归或逻辑回归, 非监督学习:是K-均值聚类, 即在数据点集中找出“聚类”. 另一种常用技术叫做主成分分析(PCA) , 用于降维, 算法的评估方法也不尽相同. ...

  4. type convert

    背景# 在开发中,我们会碰到诸如String类型转换为Int等等问题,虽然处理起来简单,但是本着DRY(Don't Repeat Yourself )原则,还是有必要封装处理下: 具体代码:Maste ...

  5. LeetCode--255--用队列实现栈(java版)

    使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作 ...

  6. git merge和git rebase的区别

    git merge是用来合并两个分支的.# 将b分支合并到当前分支git merge b git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作.例如,假设我 们有 ...

  7. python-爬虫-Beautifulsoup模块

    一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  8. leetcode-algorithms-24 Swap Nodes in Pairs

    leetcode-algorithms-24 Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and re ...

  9. sqlite3 新增数据

    cx = sqlite3.connect("c:/数据库名字")#打开数据库cu = cx.cursor()cu.execute("INSERT INTO [user] ...

  10. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转

    转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理  前言:      记录 IIS 相 ...