將已有序的子串行合併,得到有完全有序的序列
// leftstart=左邊陣列的起始位置,rightstart=右邊陣列的起始位置,rightend=右邊陣列的結束位置
void merge(elementtype a, elementtype tmpa, int leftstart, int rightstart, int rightend)
while (leftindex <= leftend) // 直接複製左邊剩下的
tmpa[tmpindex++] = a[leftindex++];
while (rightindex <= rightend) // 直接複製右邊剩下的
tmpa[tmpindex++] = a[rightindex++];
for (i = leftstart; i <= rightend; i++) // 將tmpa中的資料恢復到a中,如果在迴圈演算法中,不需要執行這個恢復過程
a[i] = tmpa[i];
}
分而治之
遞迴的把序列一分為二,直到序列只剩2個元素(可能有一組只有乙個元素)
進行子串行的合併
void msort(elementtype a, elementtype tmpa, int leftstart, int rightend)
}
時間複雜度:t(
n)=o
(nlo
gn)
統一函式介面
void merge_sort(elementtype a, int n)
msort(a, tmpa, 0, n - 1);
free(tmpa);
}
一趟歸併
對相鄰的兩段有序子列進行合併
兩兩子列進行合併,同一段子列不會在一趟歸併中參與兩次合併
需要額外處理剩餘的單個序列,保證最後把結果歸併到tmpa中
// sublen = 當前有序子列的長度
void merge_pass(elementtype a, elementtype tmpa, int n, int sublen)
統一函式介面void merge_sort(elementtype a, int n)
sublen = 1;
while (sublen < n)
free(tmpa);
}
04 排序 歸併排序
基本原理 對於給定的一組資料 假設有n個資料 首先將每兩個相鄰長度為1的子串行進行歸併,得到n 2個長度為2或者1的有序子串行,再將其兩兩合併,反覆此過程,得到乙個有序序列。package com.sort 歸併演算法 public class testmergesort else while i ...
演算法 1 排序 歸併排序
歸併排序思想 1.把長度為n的輸入序列分成兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個排序好的子串行合併成乙個最終的排序序列。小結 平均時間複雜度o nlogn 最好情況o nlogn 最壞情況o nlogn 空間複雜度o n 占用額外記憶體 穩定性 穩定 歸併排序入口 ...
3 排序演算法 歸併排序
問題描述 歸併排序演算法對下列例項排序,寫出基於歸併排序演算法對下面例項進行排序的具體過程。a 48,12,61,3,5,19,32,7 解題思想 將n個元素分成2個子集合,分別對子集合進行排序,最終將排好序的子集合合併為有序集合。n 1是中止。如下 include include using na...