• python第三十二天-----算法


    算法(Algorithm):一个计算过程,解决问题的方法
    时间复杂度:用来评估算法运行效率的一个东西
    ps:在日常使用中,请使用sort(),because no zuo no die!

    1.冒泡排序:
    指针如同气泡一样一个个由下向上浮,每次上浮如果上面的数比自己小则交换位置,这样就保证每次可以使最大的数字排列在最上面,重复此过程直到所有数有序;时间复杂度为O(n2),wtf,平方怎么打,就酱吧。

    1 def bubble_sort_x(data):
    2     for i in range(len(data)-1):                        # 在循环到最后一个数的时候就不需要再比较了,因为此时列表已经排列好了
    3         for j in range(len(data)-i-1):                    # 指针一点点上浮的过程
    4             if data[j] > data[j+1]
    5             data[j+1], data[j] = data[j], data[j+1]

    "调优后",但是你会发现并不是真正的调优,时快时慢,因为此调优仅对当某次交换完成后发现下面的数并未进行交换(也就是已经排序好了),那么就可以认为已经完成可以返回了,但是因为是这种特殊情况并不是每次都会出现,但是每次循环你必须要做一次判断,so,这个时间开销却是必须的,因此权衡利弊这下,北神还是觉得上面的好,简单易懂,萌萌哒。

    1 def bubble_sort(data):
    2     for i in range(len(data)-1):
    3         exchange = False
    4         for j in range(len(data) - i - 1):
    5             if data[j] > data[j+1]:
    6                 data[j], data[j+1] = data[j+1], data[j]
    7                 exchange = True
    8         if not exchange:
    9             return

    2.选择排序:
    默认以无序区第一个数为列表内的最小数,然后遍历列表开始跟默认比较大小,如果发现了比默认值小的则成为新的默认最小数,遍历完成后会发现列表中的最小数再与第一个数互换位置,重复此过程就可以保证列表从第一个数开始由小到大排序;时间复杂度为O(n2),运行时间比冒泡快,因为它与冒泡一样都对数就行了比较,但是并没有直接互换位置,直到一次循环完成后找到了最小数才进行了一次位置互换,so,冒泡排序被吊打了。

    1 def insert_sort_x(data):
    2     for i in range(len(data)-1):                            
    3         min_loc = i
    4         for j in range(i+1, len(data)):                        # 从下一个开始跟i比较
    5             if data[j] < data[min_loc]:
    6                 min_loc = j
    7         data[i], data[min_loc] = data[min_loc], data[i]

    3.希尔排序:
    选择排序的升级版本,讲列表进行多次分段后各自进行排序,最后形成一个偏向有序的大列表,然后对整个大列表进行一次选择排序形成最终有序列表,看不懂就对了,没什么卵用。

     1 def shell_sort_x(data):
     2     gap = int(len(data) // 2)
     3     while gap >= 1:
     4         for i in range(gap, len(data)):
     5             tmp = data[i]
     6             j = i - gap
     7             while j >= 0 and tmp < data[j]:
     8                 data[j + gap] = data[j]
     9                 j -= gap
    10             data[i - gap] = tmp
    11         gap = gap // 2

    4.快速排序:
    取第一个元素x使其归位,列表分成两部分,左边都比x小,右边都比x大,然后对这两边递归进行排序。

     1 def quick_sort_x(data, left, right):
     2     mid = partition(data, left, right)                        # x归位
     3     quick_sort_x(data, left, mid-1)
     4     quick_sort_x(data, mid+1, right)
     5     
     6 def partition(data, left, right):
     7     tmp = data[left]
     8     while left < right:
     9         while left < right and data[range] >= tmp:
    10             right -= 1
    11         data[left] = data[right]
    12         while left < right and data[left] <= tmp:
    13             left += 1
    14         data[right] = data[left]
    15     data[left] = tmp

    5.归并排序:
    将数组递归切分成单个元素后对比排序合并。

     1 def merge_sort_x(data, low, high):
     2     if low < high:
     3         mid = (low + high) // 2
     4         merge_sort_x(data, low, mid)
     5         merge_sort_x(data, mid+1, high)
     6         merge(data, low, mid, high)
     7     
     8 def merge(data, low, mid, high):
     9     i = low
    10     j = mid + 1
    11     ltmp = []
    12     while i <= mid and j <= high:
    13     if data[i] < data[j]:            # 两边数依次取出比较大小
    14         ltmp.append(data[i])
    15         i += 1
    16     else:
    17         ltmp.append(data[j])
    18         j += 1
    19     while i <= mid:                    # 下面2个while只有一个会执行
    20         ltmp.append(data[i])
    21         i += 1
    22     while j <= high:
    23         ltmp.append(data[j])
    24         j += 1
    25     data[low:high+1] = ltmp

    6.插入排序:
    默认第一个元素是有序的,然后根据依次比较下一个元素与有序区内元素确定其位置。

    1 def insert_sort_x(data):
    2     for i in range(1, len(data)):
    3         tmp = data[i]
    4         j = i - 1
    5         while j >= 0 and tmp < data[j]:
    6             data[j + 1] = data[j]
    7             j -= 1
    8         data[j + 1] = tmp

    7.堆排序:
    建立一个堆,后去掉堆顶元素为最大元素放置于堆末尾(之后不参与计算),通过一次调整再次得到堆顶,循环重复此过程。

     1 def sift(data, low, high):
     2     i = low
     3     j = 2 * i + 1
     4     tmp = data[i]
     5     while j <= high:
     6         if j < high and data[j] < data[j + 1]:
     7             j += 1
     8         if tmp < data[j]:
     9             data[i] = data[j]
    10             i = j
    11             j = 2 * i + 1
    12         else:
    13             break
    14     data[i] = tmp
    15 
    16 def heap_sort_x(data):
    17     n = len(data)
    18     for i in range(n // 2 - 1, -1, -1):
    19         sift(data, i, n - 1)
    20     for i in range(n - 1, -1, -1):
    21         data[0], data[i] = data[i], data[0]
    22         sift(data, 0, i - 1)
  • 相关阅读:
    c# 类型转换符的重载
    C# 串口读写
    STM32 Keil C++编写单片机程序
    C# 静态构造函数的使用
    MvvMlight 学习之 SimpleIoc
    STM32 之 DMA
    STM32 之 SysTick
    突然发现用PHP做多条件模糊查询很简单
    discuz代码转为html代码
    Discuz!开发之HTML转Discuz代码(bbcode)函数html2bbcode()
  • 原文地址:https://www.cnblogs.com/bfmq/p/6761840.html
Copyright © 2020-2023  润新知