归并排序算法Python实现

归并排序原理和步骤

1. 将数组分成两半,直到每个子数组的长度为1

首先,将数组分成两半。如果数组的长度大于1,将其从中间分割为两个子数组。对每个子数组继续进行这个过程,直到每个子数组的长度为1。此时,所有子数组都是有序的,因为单个元素的数组天然是有序的。

2. 递归地对每个子数组进行排序

在将数组分割为单个元素之后,通过递归方法对每个子数组进行排序。归并排序的递归性质允许我们在底层子数组有序后逐层向上合并已排序的子数组。

3. 合并两个已排序的子数组,得到一个已排序的数组

合并步骤是归并排序的核心。对于两个已经排序的子数组,通过比较它们的元素,将较小的元素依次放入新的数组中,直到所有元素都被处理完。这个过程会生成一个新的已排序数组。

4. 重复以上步骤,直到所有子数组合并成一个最终的排序数组

重复进行分割和合并的步骤,最终将所有子数组合并成一个整体,并且这个整体是有序的。通过这种递归分割和合并的方式,归并排序能够在 O(n log n) 的时间复杂度内完成对数组的排序。

归并排序的完整步骤

  1. 分割: 将数组分成两个子数组。
  2. 递归排序: 递归地对每个子数组进行归并排序。
  3. 合并: 合并两个已排序的子数组,生成一个新的已排序数组。
  4. 重复: 继续对每个子数组进行分割、排序和合并,直到所有子数组合并成一个整体。

归并排序的伪代码如下:

void mergeSort(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);
    }
}

void merge(vector<int>& arr, int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;

    vector<int> leftArr(n1), rightArr(n2);

    for (int i = 0; i < n1; ++i)
        leftArr[i] = arr[left + i];
    for (int j = 0; j < n2; ++j)
        rightArr[j] = arr[mid + 1 + j];

    int i = 0, j = 0, k = left;
    while (i < n1 && j < n2) {
        if (leftArr[i] <= rightArr[j]) {
            arr[k] = leftArr[i];
            ++i;
        } else {
            arr[k] = rightArr[j];
            ++j;
        }
        ++k;
    }

    while (i < n1) {
        arr[k] = leftArr[i];
        ++i;
        ++k;
    }

    while (j < n2) {
        arr[k] = rightArr[j];
        ++j;
        ++k;
    }
}

Python实现如下:

def merge_sort(arr):
    """
    对数组进行归并排序
    :param arr: 待排序的数组
    :return: 已排序的数组
    """
    # 如果数组的长度为0或1,直接返回数组
    if len(arr) <= 1:
        return arr

    # 找到数组的中间点
    mid = len(arr) // 2

    # 递归地对左右两个子数组进行排序
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])

    # 合并两个已排序的子数组
    return merge(left, right)

def merge(left, right):
    """
    合并两个已排序的子数组
    :param left: 左子数组
    :param right: 右子数组
    :return: 合并后的已排序数组
    """
    result = []
    i = j = 0

    # 合并两个子数组
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    # 追加剩余的元素
    result.extend(left[i:])
    result.extend(right[j:])

    return result



相关推荐

  1. 归并排序算法Python实现

    2024-07-12 02:36:01       18 阅读
  2. 【C语言】归并排序算法实现

    2024-07-12 02:36:01       30 阅读
  3. 排序算法——归并排序

    2024-07-12 02:36:01       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 02:36:01       50 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 02:36:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 02:36:01       43 阅读
  4. Python语言-面向对象

    2024-07-12 02:36:01       54 阅读

热门阅读

  1. 07-7.4.2 B+树

    2024-07-12 02:36:01       14 阅读
  2. 生信技能52 - VCF文件hg38与hg19坐标相互转换

    2024-07-12 02:36:01       16 阅读
  3. 技术总结(1)——方向与成长思考

    2024-07-12 02:36:01       21 阅读
  4. 《穿透财报:读懂财报中的逻辑与陷阱》

    2024-07-12 02:36:01       19 阅读
  5. Spring——自动装配Bean

    2024-07-12 02:36:01       18 阅读
  6. 前端高頻面試題(一)

    2024-07-12 02:36:01       20 阅读
  7. SpringBoot常见注解

    2024-07-12 02:36:01       18 阅读
  8. linux lvm使用

    2024-07-12 02:36:01       18 阅读
  9. ETag:Springboot接口如何添加Tag

    2024-07-12 02:36:01       20 阅读
  10. 3. 排序算法代码-python

    2024-07-12 02:36:01       18 阅读
  11. android 图片轮播

    2024-07-12 02:36:01       17 阅读
  12. ubuntu 检查硬盘的通电时长、健康度

    2024-07-12 02:36:01       21 阅读
  13. SQL约束

    2024-07-12 02:36:01       22 阅读
  14. 在conda虚拟环境中安装llama-parse依赖

    2024-07-12 02:36:01       18 阅读