zoukankan      html  css  js  c++  java
  • 常用排序算法(一)

    本篇主要介绍排序算法中的冒泡排序 选择排序和插入排序

    一 冒泡排序

    1、思路:首先,列表每两个相邻的数比较大小,如果前边的比后边的大,那么这两个数就互换位置。就像是冒泡一样

    2、代码关键点:

    • 趟数:n-1趟
    • 无序区

    3、图示说明:依次类推就会得到排序结果。冒泡排序的效率还是很低的

    时间复杂度:O(n2)

    实现代码:

    def bubble_sort2(data_list):
    '''
    首先, 列表每两个相邻的数如果前边的比后边的大, 那么交换这两个数
    算法复杂度O(n²)
    关键点:趟 无序区
    :param data_list:
    :return:
    '''

    for i in range(0, len(data_list) - 1):
    # i 表示第i趟 有序区有i个数
    exchange = False
    for j in range(0, len(data_list) - i - 1):
    if data_list[j] > data_list[j + 1]:
    data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
    exchange = True
    if not exchange: # 如果在1趟没有进行交换证明已经排好序了 提前终止
    return

    二 选择排序

    1、思路:一趟遍历完记录最小的数,放到第一个位置;在一趟遍历记录剩余列表中的最小的数,继续放置

    2、代码关键点:

    • 无序区
    • 最小数的位置

    时间复杂度:O(n2)

    def select_sort(li):
        for i in range(0, len(li) - 1):
            # 第i趟 有序区范围:[0:i] 无序区范围:[i:n]
            min_loc = i  # 最小数
            for j in range(i + 1, len(li)):
                if li[min_loc] > li[j]:
                    min_loc = j
            li[i], li[min_loc] = li[min_loc], li[i]

    三 插入排序

    1、思路:元素被分为有序区和无序区两部分。最初有序区只有一个元素。每次从无序区中选择一个元素,插入到有序区的位置,直到无序区变空。

    2、代码关键点:

    • 摸到的牌
    • 手里的牌

    3、图示说明

    插入后:

    实现代码

    '''
    推算过程 li = [10,5,7,9,8,3 ]
    第一趟:i = 1 j = 0 tmp = 5  条件满足j>=0  并且 li[j](10) > tmp(5) 进入循环 li[j+1](5) = li[j](10) j=-1 [5,10,7,9,8,3]
    第二趟:i = 2 j = 1 tmp = 7  条件满足j>=0  并且 li[j](10) > tmp(7) 进入循环 li[j+1](7) = li[j](10) j=0 [5,7,10,9,8,3] 
    第三趟: i = 3 j = 2 tmp = 9  条件满足j>=0  并且 li[j](10) > tmp(9) 进入循环 li[j+1](9) = li[j](10) j=1 [5,7,9,10,8,3]
    第四趟:i = 4 j = 3 tmp = 8  条件满足j>=0  并且 li[j](10) > tmp(8) 进入循环 li[j+1](8) = li[j](10) j=2 [5,7,9,8,10,3] 再次满足 条件满足j>=0  并且 li[j](9) > tmp(8) 进入循环 li[j+1](8) = li[j](9) j=1 [5,7,8,9,10]
    
    '''
    def insert_sort(li):
        for i in range(1, len(li)):
            # i即表示趟数,也表示摸到的牌的下标
            # j表示手里最后一张牌
            j = i - 1
            tmp = li[i]
            while j >= 0 and li[j] > tmp:
                li[j + 1] = li[j]
                j -= 1
            li[j + 1] = tmp
  • 相关阅读:
    Vue 冷知识(一)
    Google Chrome 谷歌浏览器 调试被坑之路
    全选、全不选、反选
    赋值运算符
    JS 数组的常用方法归纳之不改变原数组和其他
    CSS控制文字,超出部分显示省略号
    火狐浏览器解决跨域问题
    JS 数组的常用方法详解归纳之改变原数组方法
    vue项目 多文件上传并显示在页面上
    二叉搜索树操作
  • 原文地址:https://www.cnblogs.com/harryblog/p/10644347.html
Copyright © 2011-2022 走看看