🏅蓝桥杯—排序
00 分钟
2024-3-23
2024-3-23
type
status
date
slug
summary
tags
category
icon
password
😀
这里将介绍到八大排序的经典算法冒泡排序、选择排序、插入排序、归并排序、快速排序、桶排序、堆排序、基数排序。分别分为比较排序和非比较排序。
比较排序:在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。
比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说,比较排序适用于一切需要排序的情况。
非比较排序:通过确定每个元素之前,应该有多少个元素来排序。针对数组arr,计算arr之前有多少个元素,则唯一确定了arr在排序后数组中的位置。其只要确定每个元素之前的已有的元素个数即可,所有一次遍历即可解决。算法时间复杂度O(n)。
非比较排序时间复杂度低,但由于非比较排序需要占用空间来确定唯一位置。所以对数据规模和数据分布有一定的要求。
notion image

1.冒泡排序(Bubble sort)

1.1 算法思路

从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

1.2 java算法实现

平均时间复杂度:O(n^2) 空间复杂度:O(1)

2.选择排序(Selection sort)

2.1 算法思路

第一次从待排序的中数据元素选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。

2.2 算法实现

平均时间复杂度:O(n^2) 空间复杂度:O(1) 选择排序是不稳定的排序方法。

3.插入排序(Insertion sort)

3.1 算法思路

对于少量元素的排序,插入排序是一个有效的算法。
1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素 5.tem插入到该元素的后面,如果已排序所有元素都大于tem,则将tem插入到下标为0的位置 6.重复步骤2~5
notion image

3.2 算法实现

平均时间复杂度:O(n^2) 空间复杂度:O(1)

4.归并排序(Merge sort)

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

4.1 算法思路

  1. 将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,这时,可以认为只包含一个元素的子表是有序表。
  1. 将子表两两合并,每合并一次,就会产生一个新的且更长的有序表,重复这一步骤,直到最后只剩下一个子表,这个子表就是排好序的线性表。
notion image

4.2 算法实现

时间复杂度:O(nlogn) 空间复杂度:O(n) 速度仅此于快速排序

5.快速排序(Quick sort)

快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

5.1 算法思路

从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

5.2 算法实现

6.桶排序(Bucket sort)

又称箱排序,是一种比较常用的排序算法。其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序(可以是递归使用桶排序,也可以是使用其他排序算法将每个桶分别排好序),最后一次将每个桶中排好序的数输出。

6.1 算法思路

  • 1、取序列中的最大值max和最小值min
    • 取桶的范围 size=(max-min)/arr.length+1个桶
      桶的个数是 count=(max=min)/size+1
  • 2、扫描一遍数组,将各个数据放入对应的桶中。
  • 第一个桶范围[min,min+size),第二个桶范围[min+size,min+size*2)……以此类推
  • 3、每个桶中的元素分别做快速排序
  • 4、遍历所有的桶,则完成了排序

6.2 算法实现

平均时间复杂度:O(n+k) 空间复杂度:O(n+k)

7.堆排序(Heap sort)

堆排序是指利用堆这种数据结构所设计的一种排序算法

7.1 算法思路

1)将待排序序列构造成一个大顶堆
2)此时,整个序列的最大值就是堆顶的根节点。
3)将其与末尾元素进行交换,此时末尾就为最大值。
4)然后将剩余n-1 个元素重新构造成-一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

7.2 算法实现

8.基数排序(Radix sort)

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。

2种排序方式:

最低位优先法(LSD):从最低位向最高位依次按位进行排序。
最高位优先法(MSD):从最高位向最低位依次按位进行排序。