C++实现归并排序

 更新时间:2020年03月20日 07:47:14   作者:EggyGeDan  
这篇文章主要为大家详细介绍了C++实现归并排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

简单的来说,归并排序主要分为三步,一是对数组的划分,二是对数组的排序,三是对数组的合并。划分的大小是可以随自己的想法而设置,但是一般都是以2为单位,这样最小的一组的排序就比较方便。

具体一个简单的例子:

设有数列{6,202,100,301,38,8,1}

初始状态:6,202,100,301,38,8,1

第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;

第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;

第三次归并后:{1,6,8,38,100,202,301},比较次数:4;

总的比较次数为:3+4+4=11;

逆序数为14;

在利用算法实现的时候,需要利用递归的思想,函数的入口是整个数组,不断进行划分,直到划分的数组只剩下一个或两个元素为止,对这一组进行排序后,再按原来划分的大小还原并排序,这里利用一个新的数组比较方便,将两个排序后的数组,再从小到大一个一个放入新的数组。

具体代码:

#include<iostream>
#include<algorithm>
using namespace std;
 
void merge(int *data,int start,int end,int *result) 
{
  int left_length = (end - start + 1) / 2 + 1;  
  int left_index = start;
  int right_index = start + left_length;
  int result_index = start;
  while(left_index<start + left_length && right_index <end + 1) //store data into new array
  {
    if(data[left_index] <= data[right_index])
      result[result_index++] = data[left_index++];
    else
      result[result_index++] = data[right_index++];
  }
  while(left_index < start + left_length)
    result[result_index++] = data[left_index++];
  while(right_index <end+1)
    result[result_index++] = data[right_index++];
}
 
void merge_sort(int *data,int start,int end,int *result)
{
  if(1 == end - start)  //last only two elements
  {
    if(data[start] > data[end])
    {
      int temp = data[start];
      data[start] = data[end];
      data[end] = temp;
    }
    return;
  }
  else if (end == start)
    return; //last one element then there is no need to sort;
  else{
    //continue to divide the interval
    merge_sort(data, start, (end - start + 1) / 2 + start, result);
    merge_sort(data, (end - start + 1) / 2 + start + 1, end, result);
    //start to merge sorted data
    merge(data, start, end, result);
    for (int i = start; i <= end;++i)
    {
      data[i] = result[i];
    }
  }
 
}
//example
int main()
{
  int data[] = {5,3,6,7,3,2,7,9,8,6,34,32,5,4,43,12,37};
  int length = 17;
  int result[length];
  cout << "before sorted:"<<'\n';
  for (int i = 0; i < length;i++)
    cout << data[i]<<' ';
  cout << '\n'
     << "after sorted:"<<'\n';
  merge_sort(data, 0, length - 1, result);
  for (int i = 0; i < length;i++)
    cout << result[i]<<' ';
  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 在std::thread中创建并管理QEventLoop的全面解析

    在std::thread中创建并管理QEventLoop的全面解析

    QEventLoop的工作原理可以简单地理解为一个无限循环,它会不断地检查是否有新的事件需要处理,如果有,就将事件从事件队列中取出,然后找到相应的事件处理器进行处理,这篇文章主要介绍了在std::thread中创建并管理QEventLoop的全面指南,需要的朋友可以参考下
    2023-06-06
  • C语言实现获取文件MD5值

    C语言实现获取文件MD5值

    MD5(Message Digest Algorithm 5)是一种常用的哈希函数算法,这篇文章主要介绍了C语言如何获取文件MD5值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • C++实现LeetCode(137.单独的数字之二)

    C++实现LeetCode(137.单独的数字之二)

    这篇文章主要介绍了C++实现LeetCode(137.单独的数字之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ vector的基本使用示例详解

    C++ vector的基本使用示例详解

    这篇文章主要介绍了C++ vector的基本使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • C++中String的语法及常用接口的底层实现详解

    C++中String的语法及常用接口的底层实现详解

    在C语言中,string是一个标准库类(class),用于处理字符串,它提供了一种更高级、更便捷的字符串操作方式,string 类提供了一系列成员函数和重载运算符,以便于对字符串进行操作和处理,本编文章会对C++中的 string 进行详解,希望本篇文章会对你有所帮助
    2023-06-06
  • C++ vector操作实现

    C++ vector操作实现

    这篇文章主要介绍了C++ vector操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 利用stream实现一个简单的http下载器

    利用stream实现一个简单的http下载器

    这篇文章主要介绍了利用stream实现一个简单的http下载器的相关资料,需要的朋友可以参考下
    2015-03-03
  • C语言贪吃蛇经典小游戏

    C语言贪吃蛇经典小游戏

    这篇文章主要为大家详细介绍了C语言贪吃蛇经典小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++实现超市商品管理系统最新版

    C++实现超市商品管理系统最新版

    这篇文章主要为大家详细介绍了C++实现超市商品管理系统最新版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 深入解析最长公共子串

    深入解析最长公共子串

    本篇文章是对最长公共子串进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论