二路歸併排基本思想:把擁有n個資料的陣列看做n個有序序列,然後兩兩歸併,得到n/2組有序序列;重複上述操作,達到n/4組有序序列;重複上述操作,直到n個資料均為有序。
平均情況的時間複雜度 最好情況的時間複雜度 最壞情況的時間複雜度 空間複雜度
o(nlog2(n)) o(nlog2(n))
o(nlog2(n)) o(n)
資料儲存在a[1]~a[n],兩個相鄰有序序列歸併一次的**實現
void merge(type a,type b,int s,int m,int t)
else
}if(i<=m)
}else }
}
資料進行一趟歸併的**實現:
當第乙個序列的下標為i時
(1)若i<=n-2h+1,待歸併資料還有兩個相鄰的長度為h的序列;
(2)若i(3)若i>=n-h+1,只剩下乙個有序序列,直接將有序序列傳送給。
templatevoid mergepass(type a,type b,int n,int h)
if(i二路歸併的**實現:
#includeusing namespace std;
template//資料儲存在人r[1]~r[n]
void merge(type a,type b,int s,int m,int t)
else
}if(i<=m)
}else }
} templatevoid mergepass(type a,type b,int n,int h)
if(ivoid mergesort1(type a,int n)
}int main()
; for(int i=0;i<7;i++)
cout
for(int i=0;i<7;i++)
cout
}
排序 歸併排序(二路歸併)
基本思想 將兩個有序表合併成乙個有序表。將下列兩個已排序的順序表合併成乙個已排序表。順序比較兩 者的相應元素,小者移入另一表中,反覆如此,直至其中任一表都移入另 一表為止。二路歸併排序的基本思想是將兩個有序表合併成乙個有序表。給定排序碼46,55,13,42,94,05,17,70,二路歸併排序過程...
歸併排序 二路排序
先直接給出 include include include void mergearray int a,int left,int mid,int right,int tmp else 將剩餘的值賦值給臨時陣列 while i m while j n 將臨時陣列複製到目標陣列 for i 0 i k ...
二路歸併排序
不是困難的演算法,不過也是練習了下遞迴。include include include using namespace std const int maxn 100 5 int a maxn int b maxn void mergesort int a,int b,int begin,int en...