zoukankan      html  css  js  c++  java
  • 算法中常用的几种排序方式

    1.什么叫算法

    算法:可以理解为是解决问题方法的一个计算过程。

    2.时间复杂度

    用来评估算法运行效率的一个东西。时间复杂度常用大O符号表述,如O(1)。

    n = 10
    print('Hello World')    # 时间复杂度:O(1)
    ----------------------------------------------------------------
    for i in range(n):
        print('Hello World')    # 时间复杂度:O(n)
    ----------------------------------------------------------------
    for i in range(n):
        for j in range(n):
            print('Hello World')    # 时间复杂度:O(n^2)
    ----------------------------------------------------------------
    for i in range(n):
        print('Hello World') 
        for j in range(n):
            print('Hello World')    # 时间复杂度:O(n^2)
    ----------------------------------------------------------------
    for i in range(n):
        for j in range(m):
            print('Hello World')    # 时间复杂度:O(n^2)
    ----------------------------------------------------------------
    for i in range(n):
        for j in range(n):
            for k in range(n):
                print('Hello World')    # 时间复杂度:O(n^3)
    ----------------------------------------------------------------
    print('Hello Yesterday')
    print('Hello Tomorrow')
    print('Hello Today')     # 时间复杂度:O(1)

    注意:如果快速判断出时间复杂度?

      1.循坏减半的过程---->O(logn)

      2.有几次循环,时间复杂度就是n的几次方。

    3.空间复杂度

    用来评估算法内存占用大小的一个式子。

    1.冒泡排序法

    思路:① 列表每两个相邻的数,如果前边的数比后边的数大,那=那么就换两个数的位置。

    def Bubble_sort(li):
        for i in range(len(li) - 1):
            for j in range(len(li) - 1 - i):
                if li[j] > li[j+1]:  # 判断前面一个数字是否大于后面的数字
                    li[j], li[j+1] = li[j+1], li[j]   # 转换两数字之间的位置,将大的数字放后面
    
    
    li = [1,4,7,2,5,8,3,6,9]
    Bubble(li)   
    print(li)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

    2.选择排序法

    思路:① 先把列表中所有数走一趟,记录下最小的数并放置的第一个位置。

       ② 再把列表中剩余的数遍历走一趟,记录下最小的数,继续放置。

    def select_sort(li):
        for i in range(len(li)):
            minIndex = i   # 记录最小数的索引
            for j in range(i+1,len(li)):
                if li[j] < li[minIndex]:  # 判断两个索引代表数的大小
                    minIndex = j 
            if i != minIndex:  # 当i不是最小索引时,将i和最小索引进行交换
                li[i], li[minIndex] = li[minIndex],li[i]

    3.插入排序法

    思路:① 将列表被分为有序区和无序区。最开始的有序区只有首位元素。

       ② 每次从无序区抽取一个元素插入到有序区的位置,并对其进行大小比较及排序,直至有序区变空。

    def insert_sort(li):
        for i in range(1, len(li)):    # 以第二个作为无序代码的开端
            tmp = li[i]    # 索引 i 对应的值
            j = i - 1    # 索引 J 为索引 i 的前一位索引
            while j >= 0 and tmp < li[j]:    # 判断索引 i 和索引 J 对应值的大小
                li[j + 1] = li[j]
                j = j - 1
            li[j + 1] = tmp
    
    
    li = [4, 1, 7, 2, 5, 8, 3, 6, 9, 10]
    insert_sort(li)
    print(li)

    4.快速排序法

    思路:① 取一个元素P(一般取第一个元素),使元素P归位。

       ② 列表被P分为两部分,左边都比P小,右边都比P大。

       ③ 递归完成剩余的排序。

    def quick_sort(li, left, right):
        if left < right:
            mid = partition(li, left, right)
            quick_sort(li, left, mid-1)
            quick_sort(li, mid + 1, right)
    
    def partition(li, left, right):
        tmp = li[left]
        while left < right :    # left, right 代表的是索引大小
            while left < right and li[right] >= tmp:
                right -= 1
            li[left] = li[right]
            while left < right and li[left] <= tmp:
                left += 1
            li[right] = li[left]
        li[left] = tmp
        return left
    
    
    li = [4,1,7,2,5,8,3,6,9]
    quick_sort(li, 0, len(li)-1)    # 如果不减一,索引会超
    print(li)
  • 相关阅读:
    python mysql操作
    常用sql语句总结
    python 正则表达式总结
    hdu 6199 dp
    hdu 6212 区间dp
    hdu 6214 割边最少的最小割
    2017沈阳网络赛G XOR 分块(分类讨论sqrt)
    HDU 6166 二进制分组
    hdu 6194 后缀数组
    hdu 6201 树分治
  • 原文地址:https://www.cnblogs.com/blue-tea/p/12219602.html
Copyright © 2011-2022 走看看