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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

归并排序比较次数_归并排序「从入门到放弃」

發(fā)布時間:2024/1/23 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 归并排序比较次数_归并排序「从入门到放弃」 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歸并排序

歸并排序,是創(chuàng)建在歸并操作上的一種有效的排序算法,效率為O(nlogn)。1945年由約翰·馮·諾伊曼首次提出。該算法是采用分治法(Divide and Conquer)的一個非常典型的應(yīng)用,且各層分治遞歸可以同時進(jìn)行。速度僅次于快速排序,為穩(wěn)定排序算法,一般用于對總體無序,但是各子項(xiàng)相對有序的數(shù)列,歸并排序的比較次數(shù)小于快速排序的比較次數(shù),移動次數(shù)一般多于快速排序的移動次數(shù)。

歸并操作

歸并操作,也叫歸并算法,指的是將兩個已經(jīng)排序的序列合并成一個序列的操作。

歸并排序原理

既然歸并排序采用的是分治法,并且依托于歸并操作,那么其思想肯定是分而治之。我們知道歸并操作是將兩個有序的數(shù)列合并到一個有序的序列,那么對于一個無序的長序列,可以把它分解為若干個有序的子序列,然后依次進(jìn)行歸并。如果我們說每一個數(shù)字都是單獨(dú)有序的序列,那么只要把原始長序列依次分解,直到每個子序列都只有一個元素的時候,再依次把所有的序列進(jìn)行歸并,直到序列數(shù)為1

歸并排序的實(shí)現(xiàn)方法

遞歸法

原理如下(假設(shè)序列共有n個元素):

  • 將原始序列從中間分為左、右兩個子序列,此時序列數(shù)為2
  • 將左序列和右序列再分別從中間分為左、右兩個子序列,此時序列數(shù)為4
  • 重復(fù)以上步驟,直到每個子序列都只有一個元素,可認(rèn)為每一個子序列都是有序的
  • 最后依次進(jìn)行歸并操作,直到序列數(shù)變?yōu)?
  • 參考代碼

    void Merge(int r[],int r1[],int s,int m,int t){ int i=s; int j=m+1; int k=s; while(i<=m&&j<=t) { if(r[i]<=r[j]) r1[k++]=r[i++]; else r1[k++]=r[j++]; } while(i<=m) r1[k++]=r[i++]; while(j<=t) r1[k++]=r[j++]; for(int l=0; l<8; l++) r[l]=r1[l];} void MergeSort(int r[],int r1[],int s,int t){ if(s==t) return; else { int m=(s+t)/2; MergeSort(r,r1,s,m); MergeSort(r,r1,m+1,t); Merge(r,r1,s,m,t); }}

    迭代法

    原理如下(假設(shè)序列共有n個元素):

  • 將序列每相鄰兩個數(shù)進(jìn)行歸并操作,形成ceil(n/2)個序列,排序后每個序列包含兩/一個元素
  • 將序列每相鄰的兩個有序子序列進(jìn)行歸并操作,形成ceil(n/4)個序列,每個序列包含四/三個元素
  • 重復(fù)步驟2,直到所有元素排序完畢,即序列數(shù)為1個
  • 參考代碼

    void Merge(int*a,int low,int mid,int high){ inti=low,j=mid+1,k=0; int *temp=(int*)malloc((high-low+1)*sizeof(int)); while(i<=mid&&j<=high) a[i]<=a[j]?(temp[k++]=a[i++]):(temp[k++]=a[j++]); while(i<=mid) temp[k++]=a[i++]; while(j<=high) temp[k++]=a[j++]; memcpy(a+low,temp,(high-low+1)*sizeof(int)); free(temp);}void MergeSort(int*a,int n){ int length; for(length=1; length

    總結(jié)

    以上是生活随笔為你收集整理的归并排序比较次数_归并排序「从入门到放弃」的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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