最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++歸并排序代碼實(shí)現(xiàn)示例代碼

 更新時(shí)間:2025年08月09日 11:52:13   作者:乾坤未定的黑馬  
歸并排序?qū)⒋判驍?shù)組分成兩個(gè)子數(shù)組,分別對(duì)這兩個(gè)子數(shù)組進(jìn)行排序,然后將排序好的子數(shù)組合并,得到排序后的數(shù)組,這篇文章主要介紹了C++歸并排序代碼實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下

1 算法核心思想

歸并排序是一種高效的排序方式,需要用到遞歸來實(shí)現(xiàn),我們先來看一下動(dòng)圖演示:

算法核心思想如下:

1.將數(shù)組盡量平均分成兩段。

2.將這兩段都變得有序(使用遞歸實(shí)現(xiàn))。

3.將兩段合并。

2 代碼實(shí)現(xiàn)

首先,我們先定義一個(gè)歸并排序的函數(shù),里面接受三個(gè)參數(shù):

void MergeSort(int arr[], int left, int right) {
    
}

arr代表需要進(jìn)行排序的數(shù)組,left表示數(shù)組arr的最左端點(diǎn),right表示數(shù)組arr的最右端點(diǎn)。

首先我們需要把數(shù)組分成兩段,我們可以用二分的方法:

int mid = (left + right) >> 1;

這里右移(>>為右移運(yùn)算符)1為和除以2含義相同。

也可以用防溢出,因?yàn)閘eft+right的值可能會(huì)爆int,導(dǎo)致結(jié)果錯(cuò)誤:

int mid = left + (right - left) >> 1;

然后對(duì)兩段分別進(jìn)行遞歸,第一段是[1, mid],第二段是[mid+1, right]:

MergeSort(arr, left, mid);
MergeSort(arr, mid + 1, right);

由于我們需要對(duì)數(shù)組進(jìn)行操作,但是直接在arr操作可能會(huì)導(dǎo)致原始數(shù)據(jù)丟失,但是如果再創(chuàng)建一個(gè)數(shù)組會(huì)占用內(nèi)存,所以我們可以向電腦“租借”right-left+1個(gè)空間,用關(guān)鍵字new來完成:

int* tmp = new int[right - left + 1];

注意要以指針的形式定義。

由于我們要把數(shù)組變得有序,而我們歸并排序的思想就是分而治之,然后再依次變得有序,需要用到分治的思想。那么我們先定義一些變量:

int cur = 0, cur1 = left, cur2 = mid + 1;

cur為tmp數(shù)組的元素下標(biāo),cur1為第一段的最左端點(diǎn),cur2為第二段的最左端點(diǎn)。

然后我們對(duì)tmp數(shù)組和arr數(shù)組進(jìn)行循環(huán)操作,這里可以用while循環(huán),循環(huán)條件是cur1<=mid&&cur2<=right。

如果arr[cur1]比arr[cur2]更大,那么就先把a(bǔ)rr[cur2]放回tmp,否則放arr[cur1]。

代碼:

while(cur1 <= mid && cur2 <= right)
{
    if(arr[cur1] < arr[cur2])
        tmp[cur++] = arr[cur1++];
    else
        tmp[cur++] = arr[cur2++];
}

然后處理可能有的數(shù)組殘余未處理的部分:

while(cur1 <= mid)
    tmp[cur++] = arr[cur1++];
while(cur2 <= right)
    tmp[cur++] = arr[cur2++];

然后合并數(shù)組,方法跟處理時(shí)差不多的:

for(int i = 0; i < right - left + 1; i++)
    arr[left + i] = tmp[i];

就是把tmp的元素依次賦值給arr。

最有我們需要把tmp的空間還給內(nèi)存,所以我們delete一下:

delete[] tmp;

然后我們的arr就變的有序了。

但是,如果這樣寫,程序就成功被我們干崩了,因?yàn)槲覀兺泴戇f歸出口了,補(bǔ)一個(gè)遞歸出口:

if(left == right)
    return;

我們合并一下整段代碼:

void MergeSort(int arr[], int left, int right) {
    if(left == right)
        return;
    int mid = (left + right) >> 1;
    MergeSort(arr, left, mid);
    MergeSort(arr, mid + 1, right);
    int* tmp = new int[right - left + 1];
    int cur = 0, cur1 = left, cur2 = mid + 1;
    while(cur1 <= mid && cur2 <= right)
    {
        if(arr[cur1] < arr[cur2])
            tmp[cur++] = arr[cur1++];
        else
            tmp[cur++] = arr[cur2++];
    }
    while(cur1 <= mid)
        tmp[cur++] = arr[cur1++];
    while(cur2 <= right)
        tmp[cur++] = arr[cur2++];
    for(int i = 0; i < right - left + 1; i++)
        arr[left + i] = tmp[i];
    delete[] tmp;
}

3 算法時(shí)間復(fù)雜度

正常情況下,歸并排序時(shí)間復(fù)雜度為:

O(NLogN)

到此這篇關(guān)于C++歸并排序代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++歸并排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言字符串操作總結(jié)大全(超詳細(xì))

    C語言字符串操作總結(jié)大全(超詳細(xì))

    本篇文章是對(duì)C語言字符串操作進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友參考下
    2013-05-05
  • openCV4.1.1+VS2019環(huán)境配置詳解

    openCV4.1.1+VS2019環(huán)境配置詳解

    這篇文章主要介紹了openCV4.1.1+VS2019環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 利用Matlab復(fù)刻掃雷小游戲

    利用Matlab復(fù)刻掃雷小游戲

    windows自帶的游戲《掃雷》是陪伴了無數(shù)人的經(jīng)典游戲,本程序參考《掃雷》的規(guī)則進(jìn)行了簡(jiǎn)化,用Matlab實(shí)現(xiàn),感興趣的小伙伴可以學(xué)習(xí)一下
    2022-03-03
  • C++中const char*、char const*、char * const三者的區(qū)別

    C++中const char*、char const*、char * const三者的區(qū)別

    這篇文章主要介紹了C++中const char*、char const*、char * const三者的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++可變參數(shù)函數(shù)的實(shí)現(xiàn)方法示例

    C++可變參數(shù)函數(shù)的實(shí)現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于C++可變參數(shù)函數(shù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • c++ 入門——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)

    c++ 入門——淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)

    這篇文章主要介紹了c++ 淺析構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)資料,幫助大家入門c++ 編程,感興趣的朋友可以了解下
    2020-08-08
  • C語言指針引用數(shù)組案例講解

    C語言指針引用數(shù)組案例講解

    這篇文章主要介紹了C語言指針引用數(shù)組案例講解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 基于條件變量的消息隊(duì)列 說明介紹

    基于條件變量的消息隊(duì)列 說明介紹

    本篇文章小編為大家介紹,基于條件變量的消息隊(duì)列 說明介紹。需要的朋友參考一下
    2013-04-04
  • 使用C語言求N的階乘的方法

    使用C語言求N的階乘的方法

    這篇文章主要介紹了使用C語言求N的階乘的方法,包括一道相關(guān)的ACM題目示例,需要的朋友可以參考下
    2015-08-08
  • C++并查集常用操作

    C++并查集常用操作

    并查集 是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相加集合的合并和查詢問題。本文給大家分享C++并查集常用操作及算法實(shí)現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2021-07-07

最新評(píng)論

象州县| 娄烦县| 扎囊县| 湛江市| 共和县| 萝北县| 岑巩县| 兴化市| 秦安县| 海宁市| 喀喇沁旗| 库车县| 东宁县| 大足县| 朝阳区| 唐海县| 清河县| 深水埗区| 大庆市| 中江县| 昂仁县| 原阳县| 秦皇岛市| 苏州市| 永春县| 昔阳县| 图木舒克市| 高雄市| 肇东市| 兰考县| 崇义县| 缙云县| 自贡市| 江山市| 资兴市| 连云港市| 和平区| 岐山县| 岑溪市| 甘泉县| 礼泉县|