日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++归并排序递归写法

發(fā)布時間:2025/4/5 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++归并排序递归写法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歸并排序的核心:有序子列的歸并

兩個有序子列,三個指針
A子列,指針Aptr指向首地址

1132426

B子列,指針Bptr指向首地址

2152738

Tmp數(shù)組,指針Cptr首地址

比較*Aptr 和*Bptr的大小,小的放入Tmp數(shù)組,然后指針后移,大概的思路如此。
Tmp數(shù)組如下變化

1
12
1213
121315
12131524
1213152426
121315242627
12131524262728

整體代碼如下

  • 遞歸生成有序子數(shù)組:Msort函數(shù)
  • 歸并兩個有序子列:Merge函數(shù)
  • 統(tǒng)一接口:Merge_sort函數(shù)
  • #include<iostream> #include<string> #include<ctime> #include<cstdlib> using namespace std;//歸并有序子列 /* A元素數(shù)組TmpA 臨時數(shù)組L 左邊數(shù)組起始位置R右邊數(shù)組起始位置RightEnd 數(shù)組右端點 */ void Merge(int A[],int TmpA[],int L,int R,int RightEnd){int LeftEnd=R-1;int Tmp=L;//存放結果的數(shù)組的起始位置int NumElement=RightEnd-L+1;while(L<=LeftEnd&&R<=RightEnd){if(A[L]<=A[R]) TmpA[Tmp++]=A[L++];else TmpA[Tmp++]=A[R++];} while(L<=LeftEnd)//直接復制左邊剩下的 TmpA[Tmp++]= A[L++];while(R<=RightEnd)//直接復制右邊剩下的TmpA[Tmp++]=A[R++];for(int i=0;i<NumElement;i++,RightEnd--)A[RightEnd]=TmpA[RightEnd];//從TmpA數(shù)組復制回A數(shù)組 } //遞歸排序 /*A原數(shù)組TmpA臨時數(shù)組L左端點RightEnd右端點 */ void Msort(int A[],int TmpA[],int L,int RightEnd){int Center;if(L<RightEnd){Center=L+(RightEnd-L)/2;Msort(A,TmpA,L,Center);Msort(A,TmpA,Center+1,RightEnd);Merge(A,TmpA,L,Center+1,RightEnd);} } //統(tǒng)一調用接口 void Merge_sort(int A[],int N){int *TmpA;TmpA=(int*)malloc(N*sizeof(int));if(TmpA!=NULL){Msort(A,TmpA,0,N-1);delete TmpA;}else exit(0); }int main(){int a[100];srand((unsigned)time(NULL));cout<<"before Merge_sort"<<endl; for(int i=0;i<10;i++){a[i]=0+rand()%10;cout<<a[i]<<endl;}cout<<"after Merge_sort"<<endl;Merge_sort(a,10); for(int i=0;i<10;i++)cout<<a[i]<<endl;}

    排序結果

    before Merge_sort
    3
    5
    6
    0
    6
    9
    0
    2
    9
    2
    after Merge_sort
    0
    0
    2
    2
    3
    5
    6
    6
    9
    9

    補充知識

    malloc函數(shù)
    malloc 函數(shù)返回的是 void * 類型,如果寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:“不能將 void* 賦值給 int * 類型變量”。所以必須通過 (int *) 來將強制轉換。
    使用后delete掉
    包含在頭文件cstdlib中

    隨機數(shù)函數(shù)
    srand((unsigned)time(NULL))
    產生0-9之間的隨機數(shù)0+rand()*10

    srand函數(shù)包含在頭文件ctime中

    總結

    以上是生活随笔為你收集整理的C++归并排序递归写法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。