冒泡排序,插入排序,选择排序
Posted peter2014
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序,插入排序,选择排序相关的知识,希望对你有一定的参考价值。
"""
遍历数组
交换旗帜变量 = 假 (False)
从 i = 1 到 最后一个没有排序过元素的指数
如果 左边元素 > 右边元素
交换(左边元素,右边元素)
交换旗帜变量 = 真(True)
"""
def bubble_sort(arr):
for i in range(len(arr)):
flag = False
for j in range(len(arr)-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
flag = True
# 如果没有数据交换则表示已经有序,退出循环
if not flag:
break
return arr
"""
将第一个元素标记为已排序
遍历每个没有排序过的元素
“提取” 元素 X
i = 最后排序过元素的指数 到 0 的遍历
如果现在排序过的元素 > 提取的元素
将排序过的元素向右移一格
否则:break
插入提取的元素
"""
def insert_sort(arr):
if len(arr) <= 1:
return arr
# 遍历每个未排序元素
for i in range(1, len(arr)):
val = arr[i]
j = i - 1
while j >= 0:
if arr[j] > val:
arr[j + 1] = arr[j]
else:
break
j -= 1
arr[j + 1] = val
return arr
"""
重复(元素个数-1)次
把第一个没有排序过的元素设置为最小值
遍历每个没有排序过的元素
如果元素 < 现在的最小值
将此元素设置成为新的最小值
将最小值和第一个没有排序过的位置交换"""
def select_sort(arr):
for i in range(len(arr)-1):
min_idx, min_val = i, arr[i]
for j in range(i, len(arr)):
if arr[j] < min_val:
min_idx, min_val = j, arr[j]
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
from random import randint
arr = [randint(1,100) for i in range(10)]
%time bubble_sort(arr)
%time insert_sort(arr)
%time select_sort(arr)
CPU times: user 18 μs, sys: 1e+03 ns, total: 19 μs
Wall time: 19.8 μs
CPU times: user 8 μs, sys: 0 ns, total: 8 μs
Wall time: 10 μs
CPU times: user 14 μs, sys: 1 μs, total: 15 μs
Wall time: 16.9 μs
[17, 17, 22, 29, 56, 61, 89, 90, 91, 97]
- 插入排序,选择排序,冒泡排序都是O(n^2)的算法,但是插入排序的交换次数更少,更省时间
- 选择排序是不稳定的算法,相同大小的值排序前后顺序可能会不同
- 算法可视化站点https://visualgo.net/zh/sorting
以上是关于冒泡排序,插入排序,选择排序的主要内容,如果未能解决你的问题,请参考以下文章
排序算法学习(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)
[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)
总结:大厂面试常考手撕代码 —— JavaScript排序算法(冒泡排序选择排序插入排序快速排序)
直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚