常见的排序算法
- 选择排序
- 快速排序
选择排序
# selectSort
def fineMin(arr):
min_index = 0
min = arr[0]
for i in range(1,len(arr)):
if arr[i] < min:
min_index = i
return min_index
def selectSort(arr):
new_arr = [] #定义空数组用来存放数据
for i in range(len(arr)):
min_index = fineMin(arr)
new_arr.append(arr.pop(min_index))
return new_arr
,解释:
例如对于 [ 7 3 5 1 2 8 0 ] 含7个元素的数组,从小到大排序,使用选择排序的方法为:
第一步:遍历整个待排序的数组,查找到最小值0,放入新数组中 [ 0 ],剩余的数组为 [ 7 3 5 1 2 8 ];
第二步:遍历整个待排序的数组,查找到最小值1,放入新数组中 [ 0 1 ],剩余的数组为 [ 7 3 5 2 8 ];
第三步:遍历整个待排序的数组,查找到最小值2,放入新数组中 [ 0 1 2 ],剩余的数组为 [ 7 3 5 8 ];
第四步:遍历整个待排序的数组,查找到最小值3,放入新数组中 [ 0 1 2 3 ],剩余的数组为 [ 7 5 8 ];
第五步:遍历整个待排序的数组,查找到最小值5,放入新数组中 [ 0 1 2 3 5 ],剩余的数组为 [ 7 8 ];
第六步:遍历整个待排序的数组,查找到最小值7,放入新数组中 [ 0 1 2 3 5 7 ],剩余的数组为 [ 8 ];
第七步:遍历整个待排序的数组,查找到最小值8,放入新数组中 [ 0 1 2 3 5 7 8 ],剩余的数组为 [ ];
上述中每一步的时间复杂度为 ,一共有 步,因此选择排序的时间复杂度为 。由此可见,选择排序并不是一种很高效的排序方法。
快速排序
def quickSort(arr):
if len(arr) < 2:
return arr
else:
basic = arr[0] # 数组的第一个值为基准值
less = [ i for i in arr[1:] if i <= basic] # 小于基准值的子数组
greater = [i for i in arr[1:] if i > basic] #大于基准值的子数组
return quickSort(less) + [basic] + quickSort(greater)
,解释:
当选择基准数据时,该数据在通常情况下,能将待排序的数据较为平均地分成两部分:
举个最理想的情况:
对 [ 1 2 3 4 5 6 7 8 9 ] 待排序的数组使用快速排序,(【】内为基准数据,QS是quickSort的缩写)
第一步: QS[1 2 3 4] 【5】 QS[ 6 7 8 9]
第二步: QS[1] 【2】 QS[ 3 4] QS[6] 【7】 QS[8 9]
第三步: 【3】QS[4] 【8】QS[9]
步,时间复杂度为 ,该理想情况下,只需 步,因此所需的时间复杂度为