常见排序算法-python实现
常见排序算法一览表
快速排序
原理
数组中随机选一个基准元素,采用分治思想,筛选出小于基准值的的元素组成数组A和大于基准值的元素组成数组B,再将A,B分别进行选基准比较分出小于基准的数组C和大于基准的数组D,这算两个轮回,进行多轮操作直到新数组元素个数小于2。
代码
def quickSort(array):
if len(array) < 2:
return array
pivot = array[0]
l = [j for j in array[1:] if j <= pivot]
r = [j for j in array[1:] if j > pivot]
return quickSort(l) + [pivot] + quickSort(r)
归并排序
原理
选取中间值,拆分成左右两个数组A、B,再深度取中值拆分A,B得到C、D,这是两轮拆分,经过多伦拆分直到新数组元素个数小于2不能再拆分,不能再拆分的话说明最小数组一定有序,然后再递归将两个有序数组进行合并。
代码实现
def mergeSorted(arr1,arr2)
# 合并两个有序数组
i , j = 0, 0
length1, length2 = len(arr1), len(arr2)
new_arr = []
while i < length1 and j < length2:
if arr1[i] < arr2[j]:
new_arr.append(arr1[i])
i += 1
else:
new_arr.append(arr2[j])
j += 1
if i < length1:
new_arr.extend(arr1[i:])
elif j < length2:
new_arr.append(arr2[j:])
return new_arr
def ms(arr):
# 归并排序
if len(arr) < 2:
return arr
mid = int(len(arr)/ 2)
l = ms(arr[:mid])
r = ms(arr[mid:])
return mergeSorted(l, r)
堆排序
原理
堆:顺序存储
的完全二叉树
, 又分为大根堆(根>左、右)和小根堆(根<左、右)
堆排序以小跟堆为例:
- 建堆:将初试序列A视为完全二叉树的层次遍历,自底向上调整这颗完全二叉树的所有非终端结点使其满足小跟堆的要求
- 排序:将堆顶元素和堆底元素互换,同时将堆顶元素加入有序子序列,调整剩下的元素形成新堆,这是一趟,经过多趟互换调整最终排序完成
代码实现
python提供了heapq包,很方便的接口来实现堆排序
from heapq import nsmallest
def heap_sort(_list):
return nsmallest(len(_list),_list)
插入排序
原理
认定一个值是有序的,后面的依次浮动比较前一个值,小了就交换,目的是把后面的插入到前面的有序序列
代码
def insert_sort(arr):
for i in range(1,len(arr)):
j = i # 1,2,3,4 ...n-1
while j > 0:
if arr[j] < arr[j-1]:
arr[j], arr[j-1] = arr[j-1], arr[j]
j -= 1
else:
break
# 希尔排序
gap = len(arr) // 2
while gap >0 :
...插入排序里面的1换成gap
gap //= 2
冒泡排序
原理:
临近的两个值比较,大的放后面,第一遍的时候最后一个正确位置,第二遍时后两个都正确。。。。
代码
def bubule_sort(arr):
for i in range(len(arr)-1,0,-1) # n-1, n-2,... 2, 1
flag = False
for j in range(i):
if arr[j+1] < arr[j]:
arr[j], arr[j+1] = arr[j+1], arr[j]
flag = True
if not flag:
break
选择排序
原理:
假设最后一个最大,从左到右(除了最后一个)依次与最大值进行比较并交换
代码:
def selection_sort(arr):
for i in range(len(arr)-1, 0, -1): # n-1, n-2,... 2, 1
for j in range(i):
if arr[j] >arr[i]:
array[j], array[i] = array[i], array[j]
return array