一.并归排序(自定义实现)
-
merge
函数:这个函数用于将两个已排序的子数组合并为一个更大的已排序数组。它包括创建临时数组L
和R
来存储左半部分和右半部分的元素,然后比较这些元素并将它们按升序合并到原始数组arr
中。 -
mergeSort
函数:这个函数是归并排序的主要函数。它采用递归的方式将数组分为两半,然后递归地对左半部分和右半部分进行排序,最后再调用merge
函数来合并已排序的两部分。 -
main
函数:这是程序的入口点。它创建一个整数向量arr
,并在标准输出中打印原始数组的内容。然后,它调用mergeSort
函数对arr
进行排序,并再次打印排序后的结果。
#include <iostream> #include <vector> void merge(std::vector<int>& arr, int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 std::vector<int> L(n1); std::vector<int> R(n2); // 复制数据到临时数组 L[] 和 R[] for (int i = 0; i < n1; i++) { L[i] = arr[left + i]; } for (int i = 0; i < n2; i++) { R[i] = arr[mid + 1 + i]; } // 归并临时数组到 arr[left..right] int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // 复制 L[] 的剩余元素 while (i < n1) { arr[k] = L[i]; i++; k++; } // 复制 R[] 的剩余元素 while (j < n2) { arr[k] = R[j]; j++; k++; } } void mergeSort(std::vector<int>& arr, int left, int right) { if (left < right) { // 计算中间位置 int mid = left + (right - left) / 2; // 递归排序左半部分 mergeSort(arr, left, mid); // 递归排序右半部分 mergeSort(arr, mid + 1, right); // 合并已排序的两部分 merge(arr, left, mid, right); } } int main() { std::vector<int> arr = {38, 27, 43, 3, 9, 82, 10}; std::cout << "原始数组: "; for (int num : arr) { std::cout << num << " "; } std::cout << std::endl; mergeSort(arr, 0, arr.size() - 1); std::cout << "归并排序后的数组: "; for (int num : arr) { std::cout << num << " "; } std::cout << std::endl; return 0; }
二.并归函数(调用实现)
使用std::stable_sort
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> arr = {38, 27, 43, 3, 9, 82, 10}; std::cout << "原始数组: "; for (int num : arr) { std::cout << num << " "; } std::cout << std::endl; // 使用 std::stable_sort 对数组进行排序 std::stable_sort(arr.begin(), arr.end()); std::cout << "稳定排序后的数组: "; for (int num : arr) { std::cout << num << " "; } std::cout << std::endl; return 0; }
标签:arr,right,int,mid,---,算法,排序,left From: https://www.cnblogs.com/ql201209/p/17764533.html