欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)歸并排序

 更新時(shí)間:2020年03月20日 07:47:14   作者:EggyGeDan  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)歸并排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

定義:歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為二路歸并。

簡(jiǎn)單的來(lái)說(shuō),歸并排序主要分為三步,一是對(duì)數(shù)組的劃分,二是對(duì)數(shù)組的排序,三是對(duì)數(shù)組的合并。劃分的大小是可以隨自己的想法而設(shè)置,但是一般都是以2為單位,這樣最小的一組的排序就比較方便。

具體一個(gè)簡(jiǎn)單的例子:

設(shè)有數(shù)列{6,202,100,301,38,8,1}

初始狀態(tài):6,202,100,301,38,8,1

第一次歸并后:{6,202},{100,301},{8,38},{1},比較次數(shù):3;

第二次歸并后:{6,100,202,301},{1,8,38},比較次數(shù):4;

第三次歸并后:{1,6,8,38,100,202,301},比較次數(shù):4;

總的比較次數(shù)為:3+4+4=11;

逆序數(shù)為14;

在利用算法實(shí)現(xiàn)的時(shí)候,需要利用遞歸的思想,函數(shù)的入口是整個(gè)數(shù)組,不斷進(jìn)行劃分,直到劃分的數(shù)組只剩下一個(gè)或兩個(gè)元素為止,對(duì)這一組進(jìn)行排序后,再按原來(lái)劃分的大小還原并排序,這里利用一個(gè)新的數(shù)組比較方便,將兩個(gè)排序后的數(shù)組,再?gòu)男〉酱笠粋€(gè)一個(gè)放入新的數(shù)組。

具體代碼:

#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;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在std::thread中創(chuàng)建并管理QEventLoop的全面解析

    在std::thread中創(chuàng)建并管理QEventLoop的全面解析

    QEventLoop的工作原理可以簡(jiǎn)單地理解為一個(gè)無(wú)限循環(huán),它會(huì)不斷地檢查是否有新的事件需要處理,如果有,就將事件從事件隊(duì)列中取出,然后找到相應(yīng)的事件處理器進(jìn)行處理,這篇文章主要介紹了在std::thread中創(chuàng)建并管理QEventLoop的全面指南,需要的朋友可以參考下
    2023-06-06
  • C語(yǔ)言實(shí)現(xiàn)獲取文件MD5值

    C語(yǔ)言實(shí)現(xiàn)獲取文件MD5值

    MD5(Message?Digest?Algorithm?5)是一種常用的哈希函數(shù)算法,這篇文章主要介紹了C語(yǔ)言如何獲取文件MD5值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二)

    C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(137.單獨(dú)的數(shù)字之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ vector的基本使用示例詳解

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

    這篇文章主要介紹了C++ vector的基本使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • C++中String的語(yǔ)法及常用接口的底層實(shí)現(xiàn)詳解

    C++中String的語(yǔ)法及常用接口的底層實(shí)現(xiàn)詳解

    在C語(yǔ)言中,string是一個(gè)標(biāo)準(zhǔn)庫(kù)類(class),用于處理字符串,它提供了一種更高級(jí)、更便捷的字符串操作方式,string 類提供了一系列成員函數(shù)和重載運(yùn)算符,以便于對(duì)字符串進(jìn)行操作和處理,本編文章會(huì)對(duì)C++中的 string 進(jìn)行詳解,希望本篇文章會(huì)對(duì)你有所幫助
    2023-06-06
  • C++ vector操作實(shí)現(xiàn)

    C++ vector操作實(shí)現(xiàn)

    這篇文章主要介紹了C++ vector操作實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 利用stream實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http下載器

    利用stream實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http下載器

    這篇文章主要介紹了利用stream實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http下載器的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • C語(yǔ)言貪吃蛇經(jīng)典小游戲

    C語(yǔ)言貪吃蛇經(jīng)典小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言貪吃蛇經(jīng)典小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++實(shí)現(xiàn)超市商品管理系統(tǒng)最新版

    C++實(shí)現(xiàn)超市商品管理系統(tǒng)最新版

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)超市商品管理系統(tǒng)最新版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 深入解析最長(zhǎng)公共子串

    深入解析最長(zhǎng)公共子串

    本篇文章是對(duì)最長(zhǎng)公共子串進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論