關(guān)鍵詞優(yōu)化排名首頁安徽網(wǎng)站優(yōu)化
1. 介紹
歸并排序(Merge Sort)是一種采用分治法(Divide and Conquer)策略的排序算法。該算法首先將已有序的子序列合并,得到完全有序的序列。在歸并排序中,合并操作是將兩個有序表合并成一個有序表的過程。
歸并排序的原理是將數(shù)組不斷分成兩半,直到每個子數(shù)組只有一個元素,然后將這些子數(shù)組合并成一個有序的數(shù)組。合并操作需要兩個子數(shù)組都是有序的,因此歸并排序需要先對數(shù)組進行分解,然后再進行合并。
以下是歸并排序的實現(xiàn)步驟:
- 將待排序的數(shù)組不斷分成兩半,直到每個子數(shù)組只有一個元素。這一步被稱為分解。
- 對每個子數(shù)進行排序,可以使用任何有效的排序算法。這一步被稱為求解。
- 將所有已排序的子數(shù)組合并成一個有序的數(shù)組。這一步被稱為合并。
歸并排序的時間復雜度是 O(n log n),其中 n 是數(shù)組的大小。這是因為它需要將數(shù)組分解成兩半,然后再合并成一個有序的數(shù)組。歸并排序的空間復雜度是 O(n),因為在合并過程中需要額外的空間來存儲臨時變量。
2. 代碼實現(xiàn)
#include <iostream>
using namespace std; // 歸并操作,將有序數(shù)組a和b合并成一個有序數(shù)組c
void merge(int a[], int b[], int c[], int m, int n) { int i = 0, j = 0, k = 0; // i、j、k分別指向數(shù)組a、b、c的起始位置 while (i < m && j < n) { // 比較a和b中的元素,將較小的元素放入c中 if (a[i] <= b[j]) { c[k++] = a[i++]; } else { c[k++] = b[j++]; } } while (i < m) { // 將數(shù)組a中剩余的元素放入c中 c[k++] = a[i++]; } while (j < n) { // 將數(shù)組b中剩余的元素放入c中 c[k++] = b[j++]; }
} // 歸并排序函數(shù),將數(shù)組a中的元素進行排序
void mergeSort(int a[], int n) { if (n <= 1) { // 如果數(shù)組只有一個元素或為空,直接返回 return; } int mid = n / 2; // 計算數(shù)組的中間位置 int left[mid]; // 存儲數(shù)組a左邊部分的元素 int right[n - mid]; // 存儲數(shù)組a右邊部分的元素 for (int i = 0; i < mid; i++) { // 將數(shù)組a左邊部分的元素放入left數(shù)組中 left[i] = a[i]; } for (int i = mid; i < n; i++) { // 將數(shù)組a右邊部分的元素放入right數(shù)組中 right[i - mid] = a[i]; } mergeSort(left, mid); // 對left數(shù)組進行歸并排序 mergeSort(right, n - mid); // 對right數(shù)組進行歸并排序 merge(left, right, a, mid, n - mid); // 將left和right兩個有序數(shù)組合并成一個有序數(shù)組a
} // 測試歸并排序函數(shù)
int main() { int a[] = {38, 27, 43, 36, 16, 25, 6, 22}; // 待排序的數(shù)組 int n = sizeof(a) / sizeof(a[0]); // 數(shù)組的大小 mergeSort(a, n); // 對數(shù)組進行歸并排序 for (int i = 0; i < n; i++) { // 輸出排序后的數(shù)組元素 cout << a[i] << " "; } cout << endl; return 0;
}
上述代碼實現(xiàn)了一個基于分治法的排序算法——歸并排序,總結(jié)如下:
- 歸并排序?qū)?shù)組不斷分成兩半,直到每個子數(shù)組只有一個元素。然后對每個子數(shù)組進行排序,最后將所有已排序的子數(shù)組合并成一個有序的數(shù)組。
merge
函數(shù)實現(xiàn)了合并操作,將兩個有序的數(shù)組合并成一個有序的數(shù)組。mergeSort
函數(shù)是歸并排序的主要實現(xiàn)。首先判斷數(shù)組長度,如果只有一個元素或為空,直接返回。然后計算中間位置,將數(shù)組分成左右兩部分。接著對左右兩部分遞歸地進行歸并排序,最后調(diào)用merge
函數(shù)將兩個有序數(shù)組合并成一個有序數(shù)組。- 在
main
函數(shù)中,定義了一個待排序的數(shù)組a
,然后調(diào)用mergeSort
函數(shù)對其進行歸并排序。最后輸出排序后的數(shù)組元素。 - 時間復雜度為O(n log n),空間復雜度為O(n)。