数据结构——(10)手画十大排序

一、内部排序概念

1、定义

内部排序指的是待排序记录存放在计算机随机存储器中进行的排序过程

2、分类

  1. 简单的排序方法,其时间复杂度为O(n^2)

  2. 先进的排序方法,其时间复杂度为O(nlogn)

  3. 基数排序,其时间复杂度为O(d·n)

3、待排序的记录序列可有3种存储方式

  1. 待排序的一组记录存放在地址连续的一组存储单元上。在这种排序方式中,记录之间的次序关系由其存储位置决定,则是实现排序必须借助移动记录

  2. 一组待排序记录存放在静态链表中,记录之间的次序关系由指针指示,则实现排序不需要移动记录,仅需修改指针即可

  3. 待排序记录本身存储在一组地址连续的存储单元内,同时另设一个指示各个记录存储位置的地址向量,在排序过程中不移动记录本身,而移动地址向量中国这些记录的“地址”,在排序结束之后再按照地址向量中的值调整记录的存储位置

4、内部排序区别

简单排序

O(n^2)

O(n^2)

O(1)

快速排序

O(nlogn)

O(n^2)

O(nlogn)

堆排序

O(nlogn)

O(nlogn)

O(1)

归并排序

O(nlogn)

O(nlogn)

O(n)

基数排序

O(d(n+rd))

O(d(n+rd))

O(rd)

二、排序

1、插入排序

(1)、直接插入排序

基本操作:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

步骤

  1. 默认序列第一个元素已经被排序。

  2. 取下一元素从后往前与已排序序列一次比较,若小于则插入已排序元素前,大于则插入已排序元素后。

  3. 循环上述操作,直至最后一个元素插入合适位置,完成排序。

(2)、二分法排序(折半插入排序)

排序过程:在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。

(3)、希尔排序(缩小增量排序)

排序思想:通过先设置一个增量n,大小为数组长度的一半,将间隔为n的元素视作一个组,然后对每个组内部的元素进行从小到大进行插入排序;然后再将增量n缩小一半,再次进行分组插入排序,直到增量n为1

特点:子序列的构成不是简单地“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。

2、交换排序

(1)、冒泡排序

排序思想:将整个待排序的记录序列划分成有序区和无序区,初始状态有序区为空,无序区包括所有待排序的记录。对无序区从前向后依次将相邻记录的关键字进行比较,若逆序将其交换, 从 而使得关键字值 小的记录向上“飘浮”(左移),关键字值大的记录好像石块,向下“堕落”(右移)。每经过一趟冒泡排序, 都使无序区中关键字值最大的记录进入有序区,对于由 n 个记录组成的记录序列,最多经过 n-1 趟冒泡排序,就可以将这 n 个记录重新按关键字顺序排列。

  • 冒泡排序比较简单。当初始序列基本有序时,冒泡排序有较高的效率,反之效率较低。O(n2)

  • 冒泡排序只需要一个记录的辅助空间,用来作为记录交换的中间暂存单元。 O(1)

  • 冒泡排序是一种稳定的排序方法。

(2)、快速排序

思想:

快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

操作步骤:

  1. 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot)

  2. 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大

  3. 递归地对两个序列进行快速排序,直到序列为空或者只有一个元素。

举例:

  1. 随机取一个数字作为基准元素,为了方便,取第一个数字为基准元素;设置两个指针 i 和 j,它们分别指向数组的第一个元素和数组最后一个元素,即i=0,j=9。

  2. 首先让指针 j 开始向左挪动,直到找到一个小于6的数停下来。切换到指针 i 再向右挪动,直到找到一个数大于6的数停下来。 最后指针 j 停在了数字 1上,指针 i 停在了数字8上。让指针 i 和指针 j 指向的元素进行交换位置。

  3. 第一次排序完成,接着进行第2次排序,指针 j 继续向左移动,由于3 < 6 ,指针 j 停下来;接着指针 i 开始向右继续移动,由于 9 > 6,停下来,9与3进行交换位置。

  4. 第2次排序结束,继续进行第3次排序,指针 j 继续向左移动,移动到数字5的位置,由于5 < 6 ,指针 j 停下来;接着指针 i 开始向右继续移动,此时 指针 i 与 指针 j 重合,把重合点的元素5与基准元素6交换位置,这一轮循环停止执行。

3、选择排序

(1)、简单选择排序

操作步骤:首先在所有记录中选出排序码最小的记录,与第一个记录交换,然后在其余的记录中再选出排序码最小的记录与第二个记录交换,以此类推,直到所有的记录排好序为止。简单选择排序算法简单,是一种不稳定的排序方法,并且速度较慢,O(n2)。

(2)、树形选择排序

操作步骤:对 n 个记录的关键字进行两两比较,然后再对[n/2]个较小者之间再进行两两比较, 如此重复,直至选出最小关键字的记录为止。这个过程可用一棵有 n 个叶子结点的完全二叉树表示。

4、基数排序

基数排序是借助于多关键字排序思想进行排序的一种排序方法。该方法将排序关键字 K 看作是由多个关键字组成的组合关键字,即 K=k1k2…kd。每个关键字 ki 表示关键字的一位,其中 k1 为最高位,kd 为最低位,d 为关键字的位数。

おすすめ

転載: blog.csdn.net/qq_41819893/article/details/121324440