歸併排序的定義:
是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。
歸併排序的基本思想:
設r[i…n]由兩個有序子表r[i…m]和r[m+1…n]組成,兩個子表長度分別為n-i +1、n-m。
1、j=m+1;k=i;i=i; 置兩個子表的起始下標及輔助陣列的起始下標。
2、若i>m 或j>n,轉⑷ 其中乙個子表已合併完,比較選取結束。
3、選取sourcearr[i]和sourcearr[j]較小的存入輔助陣列rf。
如果sourcearr[i]否則,temparr[k]=sourcearr[j]; j++; k++; 轉⑵
4、將尚未處理完的子表中元素存入rf。
如果i<=m,將r[i…m]存入temparr[k…n] //前一子表非空
如果j<=n , 將r[j…n] 存入temparr[k…n] //後一子表非空
5、合併結束。
過程演示:
設有數列
初始狀態:35,28,58,10,61,58,97,17
第一次歸併後:,,,;
第二次歸併後:,;
第三次歸併後:;
時間複雜度為:o(nlogn)。
演算法:
#include #include int arr = ;
int k = sizeof(arr) / sizeof(arr[0]);
void merge(int sourcearr, int temparr, int startindex, int midindex, int endindex)
while (i != midindex + 1)
temparr[k++] = sourcearr[i++];
while (j != endindex + 1)
temparr[k++] = sourcearr[j++];
for (i = startindex; i <= endindex; i++)
sourcearr[i] = temparr[i];
}//內部使用遞迴
void mergesort(int sourcearr, int temparr, int startindex, int endindex)
}int main(int argc, char * argv)
getchar();
return 0;
}
八大排序 歸併排序
歸併排序 1.申請空間,使其大小為兩個已經排序的序列之和,用來存放合併後的序列。2.設定兩個指標指向兩序列的開始。3.比較兩個指標所指的元素,選擇小的放的合併空間,移動指標。4.重複3直到某個指標到達序列尾。5.將剩餘的元素拷到合併空間。實現 void merge sort int arr,int ...
八大排序 歸併排序
歸併排序 merge sort 也是一種常用的排序方法,歸併 的含義是將兩個或兩個以上的有序子串行合併成乙個新的有序子串行。如圖10 11為兩組有序子串行的歸併,有序子串行和,通過歸併把它們合併成乙個有序子串行。package ch02 import util.arrayutil public cl...
八大排序 歸併排序
歸併排序是一種很穩定,很快的排序,時間複雜度為o nlogn 作者很喜歡這個排序 大概思想就是分治,每次找一半,直到就剩一左一右兩個元素,比如說 遞迴找到最左面的也就是 發現有序,然後回溯找右面的發現右面不夠兩個,再回溯也就是合併,即和合併,取乙個temp陣列,用來儲存合併後有序的這個陣列,取左陣列...