如何使用C 中的歸併排序演算法
歸併排序是一種經典的排序演算法,它採用分治法的思想,將待排序的序列分為兩個子序列,分別進行排序,然後將兩個有序的子序列合併成一個有序的序列。下面,我們將介紹如何使用C 語言實作歸併排序演算法,並給出具體的程式碼範例。
歸併排序的核心思想是將待排序序列拆分為多個子序列,然後對子序列進行遞歸呼叫排序,最後將排序好的子序列合併。
具體步驟如下:
1) 如果序列長度為1,則表示已經有序,直接返回
2) 將序列平均分成兩個子序列,分別對兩個子序列進行遞歸調用排序
3) 將兩個有序子序列合併成一個有序序列
下面給出使用C 語言實作歸併排序演算法的程式碼範例:
#include <iostream> #include <vector> using namespace std; // 合并两个有序子序列 void merge(vector<int>& arr, int left, int mid, int right) { int i = left; // 左子序列起始索引 int j = mid + 1; // 右子序列起始索引 int k = 0; // 临时数组起始索引 vector<int> temp(right - left + 1); // 临时数组 // 比较两个子序列的元素,将较小的元素放入临时数组中 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } // 将剩余的元素复制到临时数组中 while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } // 将临时数组的元素复制回原数组 for (int m = 0; m < k; ++m) { arr[left + m] = temp[m]; } } // 归并排序递归函数 void mergeSort(vector<int>& arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; // 递归调用排序 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); // 合并两个有序子序列 merge(arr, left, mid, right); } } // 归并排序函数 void mergeSort(vector<int>& arr) { mergeSort(arr, 0, arr.size() - 1); } int main() { vector<int> arr = {4, 6, 2, 8, 9, 1, 5, 3, 7}; // 调用归并排序函数 mergeSort(arr); // 输出排序结果 for (int i = 0; i < arr.size(); ++i) { cout << arr[i] << " "; } cout << endl; return 0; }
以上程式碼是用C 實作歸併排序演算法的範例,首先定義了一個merge
函數,用來合併兩個有序子序列。然後定義了mergeSort
函數,用來進行歸併排序的遞歸呼叫。最後,在main
函數中呼叫mergeSort
函數對待排序的序列進行排序,並輸出排序結果。
歸併排序演算法是一種高效率且穩定的排序演算法,其時間複雜度為O(nlogn)。透過遞歸呼叫和合併操作,歸併排序能夠將待排序序列分成小塊進行排序,然後再將有序的子序列合併成一個有序的序列。透過使用C 語言實現的具體程式碼範例,我們可以更好地理解和掌握歸併排序演算法的實作過程。
以上是如何使用C++中的歸併排序演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!