排序演算法之歸併排序

2021-06-19 01:40:48 字數 2161 閱讀 9403

歸併排序,和快排一樣同樣採用了分治的思想,將兩個(或以上)有序表合併成乙個新的有序表。

歸併排序步驟如下:

把n個記錄看成 n個長度為 1 的有序子表;

進行兩兩歸併使記錄關鍵字有序,得到 n/2 個長度為 2 的有序子表; 

重複第2步直到所有記錄歸併成乙個長度為n的有序表為止。

下面是歸併排序演算法的遞迴實現

#include #include using namespace std;

// 合併兩個有序部分

void mergearray(int a, int first, int mid, int last, int temp)

int i = first, j = mid + 1;

int k = first;

while (i <= mid && j <= last) else

} while (i <= mid)

while (j <= last)

// 回寫到原來陣列中

for (k = first; k <= last; k++)

}// 遞迴呼叫歸併

void msort(int* a, int first, int last, int *temp)

}// 歸併排序演算法

void mergesort(int *a, int len)

int main() ;

int len = 11;

cout << "before sorting:" << endl;

for (int i = 0; i < len; i++)

mergesort(arr, len);

cout << endl << "after merge sorting:" << endl;

for (int i = 0; i < len; i++)

cout << endl;

return 0;

}

歸併排序最好、平均、最壞時間複雜度都是:o(n*log2(n))

歸併排序需要額外的儲存空間,其空間複雜度為:o(n).

歸併排序和快排、堆排序一樣是一種高效的排序演算法,在資料規模較大而且儲存空間要求足夠的情況下是非常好的選擇。

歸併排序改進和優化的方向如下:

下面是改進的乙個消除遞迴演算法:

#include #include using namespace std;

// 合併陣列中連續的兩個有序部分

void mergearray(int a, int first, int mid, int last, int temp) else

} while (i <= mid)

while (j <= last)

}// 根據設定的步長來順序歸併

void mergestep(int a, int step, int len, int temp)

// 末端注意陣列邊界

if (mid > len)

} else

}void mergesort(int a, int len)

cout << endl;

// int flag = 0; // 寫入方向標識

int* temp = (int*) malloc(len * sizeof(int));

// 消除遞迴

for (int step = 1; step < len; step = step << 1) else

} // 若flag為奇數,則表明排序結果存在於temp中,需要回寫

if (flag % 2)

} //

free(temp);

// cout << "after merge sorting:" << endl;

for (int i = 0; i < len; i++)

cout << endl;

}int main() ;

int len = 17;

mergesort(arr, len);

return 0;

}

排序演算法之歸併排序

歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...

排序演算法之歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...

排序演算法之歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個有序的子串行,再把有序的子串行合併為整體有序序列。歸併排序圖冊 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考...