一、各方法的比较
方法 | 平均时间复杂度 | 最大时间 | 最小时间 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
冒泡排序 | ||||||
选择排序 | ||||||
插入排序 | ||||||
快速排序 | ||||||
希尔排序 | ||||||
归并排序 | ||||||
堆排序 | ||||||
计数排序 | ||||||
桶排序 | ||||||
基数排序 |
二、各方法的关系
+描述
三、过程
1.冒泡排序
-
步骤讲解
两两对比,如果第一个比第二个大就交换,一直运行直到最大的放在最后;
第二轮,两两对比,如果第一个比第二个大就交换,已经比较过的不再对比;
重复,直到排好。 -
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快
当输入的数据已经是正序时 -
什么时候最慢
当输入的数据是反序时 -
可以迭代什么??
-
代码
def bubbleSort(arr):
for i in range(1, len(arr)):
for j in range(0, len(arr)-i):
if arr[j] > arr[j+1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
2.选择排序
简单直观,O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。
-
步骤讲解
在序列中找到最小的元素,放在开始;
从第二个元素开始,找到最小的,放在第二位;
依次进行 -
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快?
-
什么时候最慢?
-
可以迭代什么??
-
代码
def selectionSort(arr):
for i in range(len(arr) - 1):
# 记录最小数的索引
minIndex = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[minIndex]:
minIndex = j
# i 不是最小数时,将 i 和最小数进行交换
if i != minIndex:
arr[i], arr[minIndex] = arr[minIndex], arr[i]
return arr
3.快速排序
- 步骤讲解
从序列中随机挑选基准;
两个指针,一个从后往前j, 一个从前往后i;
取出第j个数据与基准进行对比,如果比基准小则拿出来放在第一位,再找出从前往后的i的数据,如果比基准大则放在j的位置上;
依次进行。 - 轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
- 什么时候最快?
- 什么时候最慢?
- 可以迭代什么??
- 代码
4.插入排序
-
步骤讲解
把第一个当做已经排序好的,将第二个到最后当做待排序的元素;
把待排序的与已经排好的从后向前进行对比,放在合适的位置。 -
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快?
-
什么时候最慢?
-
可以迭代什么??
-
代码
def insertionSort(arr):
for i in range(len(arr)):
preIndex = i-1
current = arr[i]
while preIndex >= 0 and arr[preIndex] > current:
arr[preIndex+1] = arr[preIndex]
preIndex-=1
arr[preIndex+1] = current
return arr
5.希尔排序
-
步骤讲解
-
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快?
-
什么时候最慢?
-
可以迭代什么??
-
代码
def shellSort(arr):
import math
gap=1
while(gap < len(arr)/2):
gap = gap*2+1
while gap > 0:
for i in range(gap,len(arr)):
temp = arr[i]
j = i-gap
while j >=0 and arr[j] > temp:
arr[j+gap]=arr[j]
j-=gap
arr[j+gap] = temp
gap = math.floor(gap/2)
return arr
6.归并排序
-
步骤讲解
-
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快?
-
什么时候最慢?
-
可以迭代什么??
-
代码
7.堆排序
-
步骤讲解
-
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快?
-
什么时候最慢?
-
可以迭代什么??
-
代码
8.桶排序
-
步骤讲解
-
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快?
-
什么时候最慢?
-
可以迭代什么??
-
代码
9.计数排序
-
步骤讲解
-
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快?
-
什么时候最慢?
-
可以迭代什么??
-
代码
10.基数排序
-
步骤讲解
-
轮次: 一共是n-1轮次,第i 轮次的对比次数是n-i
-
什么时候最快?
-
什么时候最慢?
-
可以迭代什么??
-
代码