歸併排序這個演算法,讓我回憶到一道演算法題目,就是兩個有序的陣列合併成乙個有序的陣列,相信經常刷題的同學一定很熟悉這個題目。
實際上歸併排序就是把陣列拆分成乙個乙個的元素,然後兩兩都是有序陣列,再進行合併。
這裡要說明的是,大話資料結構這本書中的歸併排序(遞迴版)的**我不是很推薦,**相對而言較為複雜一點,不好理解。
和快排函式形式類似,我們也有三個函式。
void mergesort(list *l);
void msort(int arr,int low,int high);
void merge(int arr, int low,int mid,int high);
mergesort是入口函式,msort是用來遞迴的函式,merge是真正做事情的函式。
mergesort很簡單,只是乙個入口
void mergesort(list *l)
接下來是msort
void msort(int arr,int low,int high)
int mid = low + (high - low)/2;
msort(arr,low,mid);
msort(arr,mid+1,high);
merge(arr,low,mid,high);
}
msort函式也是用來遞迴的,其一定有遞迴終止條件,就是low>=high,
low=high的時候意味這陣列已經被拆成了只剩乙個元素。首先msort左半邊,再msort 右半邊,最後merge
merge函式就很簡單了,就是兩個有序陣列合併成乙個陣列
arr[low,m]是第乙個陣列,arr[m+1,high]是第二個陣列。
void merge(int arr, int low,int mid,int high)
while(i<=mid)
while(j<=high)
for(i=low,k=0;i<=high;i++,k++)//將排好序的存回arr中low到high這區間
arr[i]=temp[k];
delete temp;//釋放記憶體,由於指向的是陣列,必須用delete
}
#include #define maxsize 10000
typedef struct
list;
void swap(list*l,int i,int j);
void print(list *l);
void merge(int arr, int low,int mid,int high);
void msort(int arr,int low,int high);
void mergesort(list *l);
void swap(list *l,int i,int j)
void print(list *l)
printf("%d ",l->r[i]);
printf("\n");
}void mergesort(list *l)
void msort(int arr,int low,int high)
int mid = low + (high - low)/2;
msort(arr,low,mid);
msort(arr,mid+1,high);
merge(arr,low,mid,high);
}void merge(int arr, int low,int mid,int high)
while(i<=mid)
while(j<=high)
for(i=low,k=0;i<=high;i++,k++)//將排好序的存回arr中low到high這區間
arr[i]=temp[k];
delete temp;//釋放記憶體,由於指向的是陣列,必須用delete
}int main()
; list l1;
int i =0 ;
for (i=0;i<9;i++)
l1.length=9;
print(&l1);
mergesort(&l1);
print(&l1);
}
歸併排序演算法詳解及其優化
思想 分治法 每個遞迴過程涉及三個步驟 第一,分解 把待排序的 n 個元素的序列分解成兩個子串行,每個子串行包括 n 2 個元素.第二,治理 對每個子串行分別呼叫歸併排序 mergesort,進行遞迴操作 第三,合併 合併兩個排好序的子串行,生成排序結果.while begin1 end1 右半陣列...
歸併排序演算法及其JS實現
歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 可以看到這種結構很像一棵完全二...
歸併排序及其分析
歸併排序演算法實現 private static void mergesort anytype a,anytype tmparray,int left,int right if leftint center left right 2 mergesort a,tmparray,left,center ...