归并排序比较次数_归并排序「从入门到放弃」
生活随笔
收集整理的這篇文章主要介紹了
归并排序比较次数_归并排序「从入门到放弃」
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歸并排序
歸并排序,是創建在歸并操作上的一種有效的排序算法,效率為O(nlogn)。1945年由約翰·馮·諾伊曼首次提出。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用,且各層分治遞歸可以同時進行。速度僅次于快速排序,為穩定排序算法,一般用于對總體無序,但是各子項相對有序的數列,歸并排序的比較次數小于快速排序的比較次數,移動次數一般多于快速排序的移動次數。
歸并操作
歸并操作,也叫歸并算法,指的是將兩個已經排序的序列合并成一個序列的操作。
歸并排序原理
既然歸并排序采用的是分治法,并且依托于歸并操作,那么其思想肯定是分而治之。我們知道歸并操作是將兩個有序的數列合并到一個有序的序列,那么對于一個無序的長序列,可以把它分解為若干個有序的子序列,然后依次進行歸并。如果我們說每一個數字都是單獨有序的序列,那么只要把原始長序列依次分解,直到每個子序列都只有一個元素的時候,再依次把所有的序列進行歸并,直到序列數為1
歸并排序的實現方法
遞歸法
原理如下(假設序列共有n個元素):
參考代碼
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); }}迭代法
原理如下(假設序列共有n個元素):
參考代碼
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總結
以上是生活随笔為你收集整理的归并排序比较次数_归并排序「从入门到放弃」的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印图片预览时图片显示不出来_办公小技巧
- 下一篇: 弱网测试用什么农_为什么用木蜡油做的家具