• 归并排序的思想


    归并排序是一种基于分治思想的经典排序算法。它将待排序的数组分成两个部分,然后递归地对这两个部分进行排序,最后再将排序好的两个部分归并成一个有序的数组。

    具体实现过程如下:

    1. 将待排序数组不断二分,直到只剩下一个元素,此时该元素就是有序的。
    2. 将相邻的两个有序数组合并成一个有序数组。合并时,对于两个数组中首位元素进行比较,将较小的元素放入新数组中,直到一个数组全部放入新数组中,最后将另一个数组直接拼接到新数组的后面。
    3. 重复步骤2,直到所有的数组合并成一个有序数组。

    时间复杂度为O(nlogn),是稳定的排序算法,但空间复杂度为O(n),需要额外的存储空间。

    python实现:

    1. def merge_sort(arr):
    2. if len(arr) <= 1:
    3. return arr
    4. mid = len(arr) // 2
    5. left = merge_sort(arr[:mid])
    6. right = merge_sort(arr[mid:])
    7. return merge(left, right)
    8. def merge(left, right):
    9. result = []
    10. left_index = 0
    11. right_index = 0
    12. while left_index < len(left) and right_index < len(right):
    13. if left[left_index] <= right[right_index]:
    14. result.append(left[left_index])
    15. left_index += 1
    16. else:
    17. result.append(right[right_index])
    18. right_index += 1
    19. result += left[left_index:]
    20. result += right[right_index:]
    21. return result

    C++实现:

    1. #include
    2. #include
    3. using namespace std;
    4. // 归并两个有序数组
    5. void merge(vector<int>& nums, int left, int mid, int right) {
    6. int i = left, j = mid + 1, k = 0;
    7. vector<int> temp(right - left + 1);
    8. while (i <= mid && j <= right) {
    9. if (nums[i] < nums[j])
    10. temp[k++] = nums[i++];
    11. else
    12. temp[k++] = nums[j++];
    13. }
    14. while (i <= mid)
    15. temp[k++] = nums[i++];
    16. while (j <= right)
    17. temp[k++] = nums[j++];
    18. for (int p = 0; p < k; ++p)
    19. nums[left + p] = temp[p];
    20. }
    21. // 归并排序
    22. void merge_sort(vector<int>& nums, int left, int right) {
    23. if (left < right) {
    24. int mid = left + (right - left) / 2;
    25. merge_sort(nums, left, mid); // 排序左边子数组
    26. merge_sort(nums, mid + 1, right); // 排序右边子数组
    27. merge(nums, left, mid, right); // 合并有序子数组
    28. }
    29. }
    30. int main() {
    31. vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5}; // 待排序数组
    32. merge_sort(nums, 0, nums.size() - 1); // 归并排序
    33. for (int i = 0; i < nums.size(); ++i) // 输出排序结果
    34. cout << nums[i] << " ";
    35. cout << endl;
    36. return 0;
    37. }

    Java实现:

     

    1. public class MergeSort {
    2. public static void mergeSort(int[] arr, int left, int right) {
    3. if (left < right) {
    4. int mid = (left + right) / 2;
    5. mergeSort(arr, left, mid); // 对左半部分进行归并排序
    6. mergeSort(arr, mid + 1, right); // 对右半部分进行归并排序
    7. merge(arr, left, mid, right); // 合并左右两个有序序列
    8. }
    9. }
    10. public static void merge(int[] arr, int left, int mid, int right) {
    11. int[] temp = new int[right - left + 1]; // 临时数组,存放合并后的序列
    12. int i = left, j = mid + 1, k = 0;
    13. while (i <= mid && j <= right) { // 将左右两个有序序列合并
    14. if (arr[i] <= arr[j]) {
    15. temp[k++] = arr[i++];
    16. } else {
    17. temp[k++] = arr[j++];
    18. }
    19. }
    20. while (i <= mid) { // 将左边剩余元素填充进temp中
    21. temp[k++] = arr[i++];
    22. }
    23. while (j <= right) { // 将右边剩余元素填充进temp中
    24. temp[k++] = arr[j++];
    25. }
    26. for (int p = 0; p < temp.length; p++) { // 将temp中的元素全部拷贝到原数组中
    27. arr[left + p] = temp[p];
    28. }
    29. }
    30. }

  • 相关阅读:
    细说spring IOC三种开发模式
    Springboot集成redis
    【Device Tree】Kernel中的gpio driver在DTS下是如何初始化的
    Kotlin中的泛型理解与应用
    vue3(二)- - - - vite3.1 + vue3.2配置axios
    Redis常见面试题总结
    中国防腐漆行业竞争态势与供需趋势预测报告2022-2028年
    java学习笔记day04
    C++的强制类型转换简介
    常见的锁策略你了解多少?
  • 原文地址:https://blog.csdn.net/qq_71356343/article/details/133049427