【数据结构之排序】

数据结构之排序(内部排序和外部排序)

  • 一、内部排序
    • 排序定义
    • 直接插入排序
    • 冒泡排序
    • 简单选择排序
    • 希尔排序
    • 快速排序
    • 归并排序
  • 二、外部排序
    • 多路平衡归并和败者树
    • 置换和选择排序
    • 最佳归并树

声明:此为个人笔记,代码一部分来自王道408课程,仅供个人学习使用,如有侵权请联系;如有转载使用,一切后果自行负责与本人无关

一、内部排序

排序定义

直接插入排序

直接插入排序算法就是先将第一个元素认为有序,然后后面的元素与第一个有序元素比较,若比它小则插到前面,若大则位不置变,此时有序序列由一个元素扩充为两个,以此类推。
【数据结构之排序】_第1张图片
【数据结构之排序】_第2张图片
算法实现:
【数据结构之排序】_第3张图片
小总结:
【数据结构之排序】_第4张图片

冒泡排序

每一趟排序都会将最大或最小的元素沉到底部或冒泡到顶部。以第一趟为例,43与21比较,43较大所以下沉,然后43与89比较,89较大所以位置不变,89再与15比较,89较大,所以89下沉,89再与28比较,89较大继续下沉,89再与43比较,89依然较大所以继续下沉,此时一轮结束找到最大的元素89.
【数据结构之排序】_第5张图片

简单选择排序

一第一趟为例,引入一个下标min,假设第一个元素最小,min=1,r[min]与r[2]~r[6]的所有元素逐一比较,发现最小的仍是r[1]则此时r[1]进入有序队列,然后将剩下的元素再进行选择排序。

希尔排序

希尔排序的特点是只跟距离为d的元素进行比较,如d=5时,59只跟23比较,发现23更小,则交换位置,48跟37比较,37较小所以交换位置,以此类推。

快速排序

先向前搜索,high所指的元素先于r[0]进行比较,发现并没有比r[0]小所以high往前移动。

high指向37发现比r[0]来的小,所以high所指的元素就移到low所指的位置。

此时向后搜索,low的位置往右移一位,指向r[2],此时r[2]接着与r[0]比较发现比r[0]小,low继续右移一位,指向r[3],r[3]比r[0]大所以r[3]的元素移到high所指的位置。

最终low=high这个位置就是59的最终位置。快速排序的特点就是每一轮会找到一个中间位置,当待排序序列基本有序时,快速排序就失效。
【数据结构之排序】_第6张图片

归并排序

特点就是两两归并,先把每一个元素都看成一个只含有自身的有序队此时有七个,然后两两归并成为一个变成4个有序队,其中59因为第一趟时没有归并对象所以就继续自成一队,
然后四个有序队接着归并,变成两个有序队,最后变成一个有序队。

二、外部排序

多路平衡归并和败者树

【数据结构之排序】_第7张图片

置换和选择排序

【数据结构之排序】_第8张图片

最佳归并树

这边利用的是赫夫曼树的思想,拓展到 n 叉树中,
实际上就是添加权值为 0 的虚结点使得 N 叉树最优,因为这边的归并操作的 IO 次数的计算等于归并树的带权路径和的两倍。
至于要添加的虚结点数量公式比较容易推

【数据结构之排序】_第9张图片

你可能感兴趣的:(数据结构,计算机408,计算机基础知识,数据结构,排序算法,算法)