亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ 歸并排序(merge sort)案例詳解

 更新時間:2021年08月24日 14:22:25   作者:Joe_Somebody  
這篇文章主要介紹了C++ 歸并排序(merge sort)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

核心思想:“分”與“合”。

主體流程

先將一個序列分成很多個不能再分割的子序列,將各個子序列分別排序后再將子序列合并。其實就是重復兩個步驟:【1】分【2】合并。
首先是第一個小問題,怎么分?
比如說一個序列:12 ,23,1,44,233,10,9,8。我們先分成兩段:12 ,23,1,44 和 233,10,9,8,
發(fā)現(xiàn)還能再分成4段:12 ,23 和 1,44------233,10 和 9,8。
再分成8段:12--23--1--44 和233--10--9--8。
這時候開始把子序列進行排序合并,一個元素就是有序的。所以不用排序。
合并成2個一組排序得到:12,23----1,44---10,233---8,9。
再合并成4個一組排序得到:1,12,23,44---8,9,10,233。
最后合并得到最終結果:1,8,9,10,12,23,44,233。

下面是分段的代碼,用遞歸實現(xiàn)。

void mergesort(int a[], int first, int last, int temp[])  
{  
    if (first < last)  
    {  
        int mid = (first + last) / 2;  
        mergesort(a, first, mid, temp);    //左邊有序  
        mergesort(a, mid + 1, last, temp); //右邊有序  
        mergearray(a, first, mid, last, temp); //再將二個有序數(shù)列合并  
    }  
}

整體思路很清晰,還差一個小問題沒解決,怎么合并?
現(xiàn)在問題就變成了怎么合并兩個有序序列,思路是比較兩個有序序列的第一個元素,誰小把誰放進最終序列的結尾,并把它從原來的隊列里面刪掉直到有個序列為空。
這時候另一個序列可能還有剩余的數(shù)據(jù)。沒關系,因為他們本身是有序的,所以我們只要按順序把他們添加到最終序列的尾部就好了。
這樣兩個有序序列就合并成一個有序序列了。
實現(xiàn)代碼:

void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  
      
    while (i <= m && j <= n)  
    {  
        if (a[i] <= a[j])  
            temp[k++] = a[i++];  
        else  
            temp[k++] = a[j++];  
    }  
  
    while (i <= m)  
        temp[k++] = a[i++];  
  
    while (j <= n)  
        temp[k++] = a[j++];
}

整體測試代碼:

#include<iostream>  
#include<math.h>  
#include<stdlib.h>  
using namespace std;  
  
//將有二個有序數(shù)列a[first...mid]和a[mid...last]合并。  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  
      
    while (i <= m && j <= n)  
    {  
        if (a[i] <= a[j])  
            temp[k++] = a[i++];  
        else  
            temp[k++] = a[j++];  
    }  
      
    while (i <= m)  
        temp[k++] = a[i++];  
      
    while (j <= n)  
        temp[k++] = a[j++];  
      
    for (i = 0; i < k; i++)  
        a[first + i] = temp[i];  
}  
void mergesort(int a[], int first, int last, int temp[])  
{  
    if (first < last)  
    {  
        int mid = (first + last) / 2;  
        mergesort(a, first, mid, temp);    //左邊有序  
        mergesort(a, mid + 1, last, temp); //右邊有序  
        mergearray(a, first, mid, last, temp); //再將二個有序數(shù)列合并  
    }  
}  
  
bool MergeSort(int a[], int n)  
{  
    int *p = new int[n];  
    if (p == NULL)  
        return false;  
    mergesort(a, 0, n - 1, p);  
    delete[] p;  //刪除p臨時數(shù)組
    return true;  
}  
  
int main()  
{  
    int i=0,temp=0;  
    int a[10]={0};  
    for(i=0;i<10;i++)  
{  
  
 a[i]=rand();  
 cout<<a[i]<<" ";  
  
}  
cout<<endl;  
MergeSort(a,10);  
for(i=0;i<10;i++) 
{  
    
    cout<<a[i]<<" ";  
  
}  
return 0;  
 }  

到此這篇關于C++ 歸并排序(merge sort)案例詳解的文章就介紹到這了,更多相關C++ 歸并排序(merge sort)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java日常練習題,每天進步一點點(5)

    Java日常練習題,每天進步一點點(5)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • mybatis-plus?分頁類型轉換工具類

    mybatis-plus?分頁類型轉換工具類

    用mybatis-plus?的分頁對象的時候,因為用mybatis-puls?查詢出來的分頁對象的records里的泛型是實體,有時候需要將實體轉換為前端展示的對象,所有寫了一個分頁數(shù)據(jù)的類型轉換工具,解決這個問題,對mybatis-plus?分頁工具類相關知識感興趣的朋友一起看看吧
    2022-03-03
  • Java中Minio的基本使用詳解

    Java中Minio的基本使用詳解

    這篇文章主要介紹了Java中Minio的基本使用詳解,MinIO 是一個基于Apache License v2.0開源協(xié)議的對象存儲服務,它兼容亞馬遜S3云存儲服務接口,非常適合于存儲大容量非結構化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機鏡像等,需要的朋友可以參考下
    2024-01-01
  • Java SpringBoot在RequestBody中高效的使用枚舉參數(shù)原理案例詳解

    Java SpringBoot在RequestBody中高效的使用枚舉參數(shù)原理案例詳解

    這篇文章主要介紹了Java SpringBoot在RequestBody中高效的使用枚舉參數(shù)原理案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • 深入解析Jdk8中Stream流的使用讓你脫離for循環(huán)

    深入解析Jdk8中Stream流的使用讓你脫離for循環(huán)

    這篇文章主要介紹了Jdk8中Stream流的使用,讓你脫離for循環(huán),本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • SpringCloud Gateway實現(xiàn)限流功能詳解

    SpringCloud Gateway實現(xiàn)限流功能詳解

    SpringCloud Gateway 是 Spring Cloud 的一個全新項目,它旨在為微服務架構提供一種簡單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了SpringCloud Gateway實現(xiàn)限流,需要的朋友可以參考下
    2022-11-11
  • RocketMQ普通消息實戰(zhàn)演練詳解

    RocketMQ普通消息實戰(zhàn)演練詳解

    這篇文章主要為大家介紹了RocketMQ普通消息實戰(zhàn)演練詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Java使用組合模式實現(xiàn)表示公司組織結構功能示例

    Java使用組合模式實現(xiàn)表示公司組織結構功能示例

    這篇文章主要介紹了Java使用組合模式實現(xiàn)表示公司組織結構功能,簡單描述了組合模式的概念、功能并結合實例形式分析了Java使用組合模式實現(xiàn)公司組織結構表示功能具體操作步驟與相關注意事項,需要的朋友可以參考下
    2018-05-05
  • mybatis中mapper.xml文件的常用屬性及標簽講解

    mybatis中mapper.xml文件的常用屬性及標簽講解

    這篇文章主要介紹了mybatis中mapper.xml文件的常用屬性及標簽講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中volatile關鍵字的作用

    Java中volatile關鍵字的作用

    這篇文章主要介紹了Java中volatile關鍵字的作用,文章基于Java的相關資料展開對volatile關鍵字作用的詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04

最新評論