几种常见的排序算法(冒泡排序、选择排序、插入排序、快速排序)
1、冒泡排序
每次比较相邻的两个数,若顺序错误就相互交换。
def sort_bubble(arr):
for i in range(int(len(arr))): # 共比较n趟
for j in range(len(arr) - 1): # 每趟比较n-1次
if arr[j] > arr[j + 1]: # 比较相邻的两个数
arr[j], arr[j + 1] = arr[j + 1], arr[j] # 若方向不对,就交换位置
调用:
data1 = [1, 6, 3, 2, 7, 10, 13, 24, 5, 43, 23, 10, 26, 28, 67, 1]
sort_bubble(data1)
2、选择排序
选择排序每趟排序会将目前最大(或最小的)数排好,示例是每趟排好一个最小值。
def sort_selection(arr):
for i in range(len(arr)): # 共n趟,arr[i]存储了当前最小的值
for j in range(i + 1, len(arr)): # 从i后开始找比i小的
if arr[i] > arr[j]: # 比较当前下标i与j的值
arr[i], arr[j] = arr[j], arr[i] # 如果比arr[i]小就交换
调用:
data1 = [1, 6, 3, 2, 7, 10, 13, 24, 5, 43, 23, 10, 26, 28, 67, 1]
sort_selection(data1)
3、插入排序
每趟选择一个数,插入到前面已经排好的数列中。
def sort_insertion(arr):
for i in range(1, len(arr)): # 第一个数默认排好,选择第二个数开始插入
j = i - 1 # 从待插入的数前从后向前比较,j记录下标待插入的数需要比较的排好顺序的列表的下标
temp = arr[i] # 暂存当前需要插入的数
while j >= 0: # 从后向前比较
if temp < arr[j]: # 比较当前数比要插入的大小
arr[j + 1] = arr[j] # 若比要插入的数大,则该数后移
else:
arr[j + 1] = temp # 若比要插入的数小,则将待插入的数存到当前位置
break
j -= 1 # 下标前移
调用:
data1 = [1, 6, 3, 2, 7, 10, 13, 24, 5, 43, 23, 10, 26, 28, 67, 1]
sort_selection(data1)
4、快速排序
快速排序采用分治法思想,采用递归方法完成排序。
基本思路:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
def partition(arr, begin, end):
flag = 0 # 标识符,记录比较顺序是从前往后还是从后向前
sub = begin # 记录待填补的下标
key = arr[begin] # 选择第一个作为比较对象
begin += 1 # 由于是将第一个数作为基准,因此比较从第二个数开始比较
while begin <= end: # 前后相等也要比较,因为已经取出第一个数,前后相等即为比较两个数
if flag == 0: # 从后向前找比标准值小的,放前面
if key >= arr[end]: #比较当前值与基准值大小
arr[sub] = arr[end] # 若当前值比基准值小,则将后面的这个较小值填入前面的空中
sub = end # 更新当前空的下标
flag = 1 # 下一次从前向后比
end -= 1 # 更新后面待比较值的下标
else: # 从前向后找比标准值大的,放后面
if key <= arr[begin]: # 比较当前值与基准值大小
arr[sub], sub = arr[begin], begin # 若当前值比基准值大,则将前面的这个较大值填入后面的空中,并更新空的下标
flag = 0 # 下一次从后向前比
begin += 1 # 更新前面待比较值的下标
arr[sub] = key # 循环结束,列表已经分为前后两部分,前面的都比基准值小,后面的都比基准值大,将基准值填到目前空的位置,即将列表分为两部分的中间位置
return sub # 返回当前的基准值下标,后面将前后两部份分别运算
def sort_quick(arr, begin, end):
if begin < end:
mid = partition(arr, begin, end) # 将列表分为两部分
sort_quick(arr, begin, mid - 1) # 前半部分递归调用
sort_quick(arr, mid+1, end) # 后半部分递归调用
调用:
data1 = [1, 6, 3, 2, 7, 10, 13, 24, 5, 43, 23, 10, 26, 28, 67, 1]
sort_quick(data1, 0, len(data1) - 1)