zoukankan      html  css  js  c++  java
  • 通过python代码实现冒泡排序、插入排序,选择排序,快速排序算法

    一、冒泡排序

    冒泡排序原理:将相邻的两个数进行比较,较大的数往上冒,较小的数往下降。达到一个升序的效果。

    # 冒泡排序
    def func(li):
        for i in range(len(li)-1):     # i 表示第i趟
            exchange = False
            for j in range(len(li)-i-1):   # j 表示无序区里的元素下标
                if li[j] > li[j+1]: 
                    li[j],li[j+1] = li[j+1],li[j]
                    exchange = True
            if exchange == False:
                return None         
    li = [3,2,5,4,1,6,7,8,9]
    func(li)
    print(li)

    注意:exchange是一个优化,当第i趟的时候,已经排好序,那么就不用再继续遍历无序区的元素,进行比较。

    时间复杂度为:O(n2)

    二、选择排序

    选择排序原理:以列表的第一个位置的数为基数,与剩余的数中最小的数进行比较,如果基数比最小的数要大,那么交换两个数的位置,否则位置不变。然后再以第二个位置的数为基数,与无序区中的最小数进行比较,如果基数比最小的数要大,那么交换两个数的位置,否则位置不变。以此类推。

    # 选择排序
    def func(li):
        for i in range(len(li)-1):    # i 表示第i趟
            min_id = i
            for j in range(i+1,len(li)):   #  j 表示无序区的元素下标
                if li[j] < li[min_id]:
                    min_id = j
            li[i],li[min_id] = li[min_id],li[i]
    
    li = [9,7,6,8,1,2,3,4,5]
    func(li)
    print(li)

    注意:min_id接收的是最小元素的下标。len(li)-1为趟数。

    时间复杂度为:O(n2)

    三、插入排序

    插入排序算法的原理:以列表的第一数为基数,随机抽取剩余数中一个作为随机数,与基数进行比较排序,再随机抽取剩余数中的一个作为随机数,与前面的小列表进行插入排序,依次类推。

    # 插入排序
    def func(li):
        for i in range(1,len(li)):
            tmb = li[i]
            j = i - 1
            while j >= 0 and li[j] > tmb:
                li[j+1] = li[j]
                j -= 1
            li[j+1] = tmb
    li = [4,3,6,5,1,2,7,8,9]
    func(li)
    print(li)

    时间复杂度:O(n2)

    四、快速排序

    快速排序原理比较复杂,将最左边的数取出赋值给tmd,然后从最右边的开始遍历,找到比tmd小的数赋值给left这个位置,然后将从最左边开始遍历找到比tmd大的数,赋值为right位置,最后递归完成排序,看代码。

    # 快速排序
    def func(li,left,right):
        tmd = li[left]
        while left < right:
            while left < right and li[right] >= tmd:
                right -=1
            li[left] = li[right]
            while left < right and li[left] <= tmd:
                left += 1
            li[right] = li[left]
        li[left] = tmd
        return left
    
    def quick_sort(li,left,right):
        if left < right:
            mid = func(li,left,right)
            quick_sort(li,left,mid-1)
            quick_sort(li,mid+1,right)
    
    li = [5,7,3,4,2,1,8,9,6]
    # func(li,0,len(li)-1)
    quick_sort(li,0,len(li)-1)
    print(li)

    时间复杂度:O(nlogn)

  • 相关阅读:
    一致性 hash 算法( consistent hashing )
    UIScrollView的使用2个妙招:键盘遮挡,View 支持滚动
    iphone UI的大小(转)
    XCode 4创建ipa文件及提交应用程序
    我也设计模式——9.Bridge
    3.设计用于浅串行化的类
    我也设计模式——19.Mediator
    我也设计模式——16.Interpreter
    我也设计模式——22.Iterator
    我也设计模式——15.Chain of Responsablity
  • 原文地址:https://www.cnblogs.com/youhongliang/p/12824538.html
Copyright © 2011-2022 走看看