冒泡排序,插入排序,选择排序

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排序算法(冒泡排序选择排序插入排序快速排序)

JavaScript算法(冒泡排序选择排序与插入排序)

直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚