数据结构与算法--交换排序与归并排序


回顾

  • 排序的基本概念,包括稳定排序与不稳定排序。
  • 直接插入排序和简单选择排序方法。
  • 通过待排序和排序后的关键字序列,判断使用的排序方法(例如冒泡排序)。

提要

  • 交换排序:冒泡排序、快速排序。
  • 归并排序:二路归并排序。
  • 各种内排序算法的讨论。

冒泡排序

  • 通过相邻记录的比较和交换,将无序区关键字最小的记录逐步交换到无序区的第一位,加入到有序区。
  • 如果一趟排序没有发生交换,则排序结束。
  • 在这里插入图片描述

冒泡排序的过程

  • 通过示例展示冒泡排序的初始状态和每一趟排序后的结果。
  • 在这里插入图片描述

冒泡排序的实现

void BubbleSort(ElemType L[], int n) {
    int i, j;
    bool exchange;
    ElemType tmp;
    for (i = 0; i < n - 1; i++) {
        exchange = false;
        for (j = n - 1; j > i; j--) {
            if (L[j] < L[j - 1]) {
                tmp = L[j];
                L[j] = L[j-1];
                L[j-1] = tmp;
                exchange = true;
            }
        }
        if (exchange == false) return;
    }
}

冒泡排序算法评价

  • 时间复杂度:O(n²)。
  • 空间复杂度:O(1)。
  • 是稳定的排序算法。
  • 在这里插入图片描述

快速排序

  • 通过选择枢轴元素,将序列分为两个子序列,递归地对子序列进行排序。
  • 在这里插入图片描述

快速排序的划分方法

  • 选择序列第一个元素作为枢轴,通过low和high指针移动,将序列分为两部分。
  • 每趟排序,使一个元素放入其最终位置,这个元素称为枢轴(pivot),通常选序列的第一个元素。
  • 枢轴把整个序列划分为两个子序列。利用递归,分别对子序列重复相同过程,直至子序列长度为0或1为止。
  • 在这里插入图片描述

快速排序的过程

  • 通过示例展示快速排序的初始状态和划分过程。
  • 在这里插入图片描述
  • 在这里插入图片描述

快速排序的实现

void QuickSort(ElemType L[], int s, int e) {
    int low = s, high = e;
    ElemType x = L[s];
    while (low < high) {
        while (low < high && L[high] >= x) high--;
        L[low] = L[high];
        while (low < high && L[low] < x) low++;
        L[high] = L[low];
    }
    L[low] = x;
    if (s < low - 1) QuickSort(L, s, low-1);
    if (high + 1 < e) QuickSort(L, high+1, e);
}

快速排序算法性能分析

  • 时间复杂度:最好情况O(nlog2n),最坏情况O(n²)。
  • 空间复杂度:最坏情况O(n),一般情况O(log2n)。

快速排序的改进

  • 选择两个轴把序列划分为三个子序列,以避免最坏情况。
  • 在这里插入图片描述

归并排序

  • 将两个或多个有序序列合并为一个新的有序序列的过程。
  • 最简单的归并排序是
    将两个有序序列合并为一个有序序列的过程,称为二路归并排序。

二路归并排序

  • 将长度为n的无序序列分成n个长度为1的有序子序列,逐步归并。
    在这里插入图片描述

合并两个有序表

  • 描述了如何将两个有序序列合并为一个新的有序序列。
  • 在这里插入图片描述

归并排序示例

  • 通过具体序列展示二路归并排序的每一趟结果。
    在这里插入图片描述

归并排序算法性能分析

  • 时间复杂度:O(nlog2n)。
  • 空间复杂度:O(n)。

各种内排序方法的比较

  • 将排序方法按平均时间分为三类:平方阶排序、线性对数阶排序、线性阶排序。
  • 平方阶O(n2)排序:一般称为简单排序,如直接插入、简单选择和冒泡排序;
  • 线性对数阶O(nlog2n)排序:如快速、堆和归并排序;
  • 线性阶O(n)排序:如基数排序。

各种内排序算法的特点

  • 对比不同排序方法的时间复杂度、空间复杂度、稳定性。
    在这里插入图片描述

总结

  • 介绍了直接插入排序、简单选择排序、快速排序、二路归并排序的思想和排序过程。
  • 展示了快速排序的一次划分过程。
  • 提供了前三种排序的算法实现。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排序是计算机科学中常见的操作,它将一组元素按照特定的顺序重新排列。排序算法的目标通常是将元素按照升序或降序排列。 常见的排序算法有很多种,每种算法都有不同的时间复杂度和空间复杂度。以下是几种常见的排序算法: 1. 冒泡排序(Bubble Sort):比较相邻的两个元素,如果顺序不正确就交换位置,每次遍历将一个最大(最小)的元素移到最后(最前)。时间复杂度为O(n^2)。 2. 插入排序(Insertion Sort):将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入已排序部分的适当位置。时间复杂度为O(n^2)。 3. 选择排序(Selection Sort):每次从未排序部分选择一个最小(最大)的元素放到已排序部分的末尾。时间复杂度为O(n^2)。 4. 快速排序(Quick Sort):选取一个基准元素,将数组划分为两个子数组,小于基准元素的放在左边,大于基准元素的放在右边,然后对子数组进行递归排序。时间复杂度平均情况下为O(nlogn),最坏情况下为O(n^2)。 5. 归并排序(Merge Sort):将数组递归分成两个子数组,然后对子数组进行排序,最后将两个已排序的子数组合并成一个有序数组。时间复杂度为O(nlogn)。 6. 堆排序(Heap Sort):将数组构建成一个最大(最小)堆,每次从堆顶取出最大(最小)元素放到已排序部分的末尾,然后调整堆使其满足堆的性质。时间复杂度为O(nlogn)。 这里只介绍了几种常见的排序算法,每种算法都有其适用的场景和优缺点。在实际应用中,根据数据规模和性能要求选择合适的排序算法非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值