原地歸併排序 Merge Sort in place
師姐給身邊的某小朋友 出了道題:O(1)空間複雜度實現歸併排序
在草紙上筆畫了一下,20分鐘編碼除錯
思路是:merge的時候,merge(arr, l, m, n)在 l m+1處放 i j指標,
迴圈i直到m 若arr[j]>arr[i] 則右移 i-m的元素 j++ m++
簡單修改 使用模板 就可以擴充套件到多種arr型別,以下簡單以陣列為例
#include <iostream>
using namespace std;
void merge(int* arr, int l, int m, int n){
int i=l, j=m+1;
while(i<=m && j<=n){
if(arr[i]>arr[j]){//向右平移左半部分
int tmp = arr[j];
for(int t=j; t>i; t--)
arr[t]=arr[t-1];
arr[i] = tmp;
++m;
++j;
}
++i;
}
}
void mergeSort(int* arr, int l, int n){
if(l<n){
int m = (l+n)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, n);
merge(arr, l, m, n);
}
}
int main(){
int a[9] = {2, 3, 9, 3, 1, 4, 6, 8, 10};
mergeSort(a,0,8);
for (int i=0; i<=8; ++i)
cout<<a[i]<<" ";
cout<<endl;
}
相關文章
- 排序演算法之「歸併排序(Merge Sort)」排序演算法
- 歸併排序演算法(merge_Sort)排序演算法
- (戀上資料結構筆記):歸併排序(Merge Sort)資料結構筆記排序
- 演算法與資料結構系列 ( 七 ) - 歸併排序- Merge Sort演算法資料結構排序
- 排序合併連線(sort merge join)的原理排序
- Sort排序專題(7)歸併排序(MergeSort)(C++實現)排序C++
- Oracle表連線操作——Merge Sort Join(合併排序連線)Oracle排序
- [排序] 歸併排序排序
- Go channel 實現歸併排序中的 merge 函式Go排序函式
- 歸併排序排序
- 快速排序&&歸併排序排序
- Array.sort 演算法原理(插入排序\快速排序in-place實現)演算法排序
- 四、歸併排序 && 快速排序排序
- java歸併排序Java排序
- [java]歸併排序Java排序
- 歸併排序模板排序
- 歸併排序--二路排序排序
- 排序演算法__歸併排序排序演算法
- 排序演算法:歸併排序排序演算法
- 歸併排序和基數排序排序
- 歸併排序--排序演算法排序演算法
- 排序演算法 - 歸併排序排序演算法
- 排序演算法——歸併排序排序演算法
- 排序演算法(歸併排序)排序演算法
- 歸併排序 js demo排序JS
- C# 歸併排序C#排序
- 【筆記】歸併排序筆記排序
- 歸併排序例項排序
- 排序演算法之 '歸併排序'排序演算法
- php實現 歸併排序,快速排序PHP排序
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- go 實現歸併排序Go排序
- 歸併排序——C語言排序C語言
- 歸併排序 nO(lgn) 稽核中排序
- 歸併排序加例題排序
- Java實現歸併排序Java排序
- 歸併排序求逆序數排序
- 連結串列歸併排序排序