歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。
排序的思想就是將元素無限拆分,直到無可拆分為止,再將拆分的元素兩兩按序合併。
歸併排序的原理可以通過下面這張圖看清楚:
/**
*@title: mergesort
*@description: 歸併排序
*@param: array
* void@throws
*/public
static
void
mergesort(int array)
/** *@title: sort
*@description: 使用歸併排序,對array的left~right進行排序
*@param: array
*@param: temp
*@param: left
*@param: right
*/private
static
void
sort(int array, int temp, int left, int right)
if (mid + 1
< right)
// 合併左右兩邊的元素
merge(array, temp, left, mid, right);
}/**
*@title: merge
*@description: 借助temp陣列,合併mid元素左右的元素
*@param: array
*@param: temp
*@param: left
*@param: mid
*@param: right
*/private
static
void
merge(int array, int temp, int left, int mid, int right) else
}while (i <= mid)
while (j <= right)
t = 0;
// 將temp中的元素全部拷貝到原陣列中
while (left <= right)
} array[j] = temp;
從上面的**中可以看出每次合併操作的時間複雜度是o(n),而二叉樹的深度是log2n,所以總的時間複雜度是o(n*lgn)。
因為在合併的時候,如果兩個數相等,可以將前面的數先放到輔助陣列中,所以歸併排序是穩定的。
常用排序演算法穩定性 時間複雜度
首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資料其在序列中的先後位置順序與排序後它們兩個先後位置順序相同。再簡單具體一點,如果a i a j,ai 原來在 aj 位置前,排序後 ai 仍然 是在 aj 位置前。下面我們分析一下穩定性的好處 1 如果排序演算法是穩定的,那...
排序演算法時間複雜度 空間複雜度 穩定性整理
涉及排序演算法包括 簡單選擇排序 直接插入排序 希爾排序 歸併排序 氣泡排序 快速排序 堆排序 基數排序 時間複雜度 快些以nlogn的速度歸隊 此句表示時間複雜度為o nlogn 的排序,快 表示快速排序,些 表示希爾排序,歸 表示歸併排序,隊 表示堆排序,其他排序均為o n 特殊的基數排序為o ...
排序演算法的複雜度和穩定性
本文簡單介紹幾種面試中常用的排序演算法,並對每個演算法的時間複雜度 空間複雜度 穩定性進行分析。1 氣泡排序 void swap int num1,int num2 void bubblesort int array,int size int main int argc,const char arg...