zoukankan      html  css  js  c++  java
  • python排序算法之冒泡,选择,插入

    1.参考

    一本关于排序算法的 GitBook 在线书籍 《十大经典排序算法》,使用 JavaScript & Python & Go 实现

    2.冒泡排序:两两比较,互换位置

    arr = [9,8,2,23,3]
    
    # 冒泡排序 两两比较,互换位置
    # 3 5 9 1 8
    # A B C D E
    # 3 5 9 1 8
    # 3 5 9 1 8
    # 3 5 1 9 8
    # 3 5 1 8 9
    # 第一轮比较将最大数排到最后,5个数总共需要4轮即1,2,3,4
    # 比较是arr[j] > arr[j+1],第一轮j取前4个数即range(4)即可,第二轮j取前3个数range(3)即可
    # 5个数总共比较 4 3 2 1 = 10次
    
    
    def bubble_sort(arr):
        print 'bubble_sort:',arr
        count = 0
        for i in range(1, len(arr)):
            for j in range(len(arr)-i):
                count += 1
                if arr[j] > arr[j+1]:
                    arr[j], arr[j+1] = arr[j+1], arr[j]
        print 'bubble_sorted:', count, arr
    bubble_sort([9,8,2,23,3])    
    # bubble_sort([int(i) for i in raw_input(':').split()])   

    2.选择排序:找出极值,换到队头

    # 3 5 9 1 8
    # A B C D E
    
    def select_sort(arr):
        count = 0
        for i in range(len(arr)-1): #总共需要4次min or max
            arr_min = min(arr[i:])  #取出的数放在列首更容易处理
            arr.remove(arr_min)
            arr.insert(i, arr_min)  #注意插入位置更新
        print arr
    # select_sort(arr[:])   
    
    # 五个数字需要4轮
    # 0位和1,2,3,4比较,小的马上换到0位
    # 1位和2,3,4比较,小的马上换到1位
    
    def select_sort1(arr):
        count = 0
        for i in range(len(arr)-1):
            for j in range(i+1, len(arr)):
                count += 1
                if arr[i] > arr[j]:  #注意arr[i]一直被更新
                    arr[i], arr[j] = arr[j], arr[i]
        print count
        print arr
    # select_sort1(arr[:])   
    
    def select_sort2(arr):
        print 'select_sort2:',arr
        count = 0
        for i in range(len(arr)-1):
            min_index = i
            for j in range(i+1, len(arr)):
                count += 1
                if arr[min_index] > arr[j]:
                    min_index = j
            arr[i], arr[min_index] = arr[min_index], arr[i]  #一轮之后再更新 arr[i]
        print 'select_sort2ed:', count, arr
    select_sort2([9,8,2,23,3])  

    3.插入排序:打牌,已排+未排,逐个插入(折半优化)

    # 3 5 9 1 8
    # A B C D E
    #A已排序,BCDE未排序
    #AB已排序,CDE未排序
    def insert_sort(arr):
        print 'insert_sort:',arr
        count = 0
        for i in range(1, len(arr)):  #操作数是B
            for j in range(0,i):  #操作数是A
                count += 1
                print 'B', arr[i], 'A', arr[j], arr
                if arr[i] < arr[j]:
                    arr.insert(j, arr[i])  
                    arr.pop(i+1)  #先插入,导致原来要移除的位置推后1位
                    print arr
                    break
        print 'insert_sorted:', count, arr
    
    insert_sort([9,8,2,23,3]) 
  • 相关阅读:
    vue打包传递参数配置域名
    相同域名nginx下部署两个vue项目
    vue项目改造服务端渲染
    vue项目使用less全局变量
    postMessage跨域实现localstorage跨域共享
    node_webkit打包成桌面应用程序
    vue项目本地服务器设置既能localhost访问又能手机ip访问
    GATT scan的流程
    Windows下面的常用的快捷键
    把驱动编译进内核和编译成模块
  • 原文地址:https://www.cnblogs.com/my8100/p/sorting.html
Copyright © 2011-2022 走看看