zoukankan      html  css  js  c++  java
  • python 排序算法

    一、冒泡排序

    两层for循环,内循环比较当前数与下一位的大小,如小,交换位置。

    1 def bubble_sort(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], data[j + 1] = data[j + 1], data[j]

    二、插入排序

    循环有序数列后的每一位数,如果大于有序数列的最后一位,则两数交换位置,再与有序数列的最后第二位比较,以此类推。

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

    三、选择排序

    每次for循环都找出最小的数,作为该次循环的结果

    1 def select_sort(data):
    2     for i in range(len(data)-1):
    3         min_num = i
    4         for j in range(i+1, len(data)):
    5             if data[j]<data[i]:
    6                 min_num = j
    7             data[i], data[min_num] = data[min_num], data[i]

    四、快排

    选第一个数,从左开始循环比较,如小于,停止循环,将小的数放至第一个数位置,从右开始循环,如大于,停止循环,将大的数放到上次循环空位上,如此循环直到left = right,返回mid,进行递归

     1 def quick_sort(data,left,right):
     2     if left<right:
     3         mid = partition(data,left,right):
     4         quick_sort(data,left,mid-1)
     5         quick_sort(data,mid+1,right)
     6 
     7 def partition(data,left,right):
     8     tmp = data[left]
     9     while left < right:
    10         while left < right and data[right]>=tmp:
    11             right -= 1
    12         data[left] = data[right]
    13         while left < right and data[left]<=tmp:
    14             left += 1
    15         data[right] = data [left]
    16     data[left] = tmp
    17     return left

    五、堆排序

    先从最小的有子节点的父节点开始循环调整建堆,然后取数,将堆末与堆顶换位,再进行一次除开已换下位的堆顶的调整,如此循环。

    def sift(data,low,high):
        i = low
        j = 2*i + 1
        tmp = data[i]
        while j <= high:  # 只要没到最后根最后
            if j < high and data[j] < data[j + 1]:  # 是否有右孩子,且右孩子大于左孩子
                j = j + 1  # j 成为最大孩子的下标
            if tmp < data[j]:  # 最大的孩子是否大于父亲
                data[i] = data[j]  # 子孩子上位
                i = j  # 重新赋值下标
                j = 2*i + 1
            else:  # 上述条件都不满足,跳出循环
                break
        data[i] = tmp
    
    def heap_sort(data):
        n = len(data)
        for i in range(n // 2 -1 ,-1,-1):
            sift(data,i,n-1)
        for i in range(n-1,-1,-1):
            data[0],data[i] = data[i],data[0]
            sift(data,0,i-1)
  • 相关阅读:
    WCF寻址
    WCF之多个协定
    WCF之多个终结点
    WCF客户端和服务端配置
    VS2012新建项目出错:未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService
    windows运行打开服务命令
    Android中 服务里的方法抽取成接口
    Android Studio 使用genymotion 模拟器运行app时 提示找不到任何设备
    SVN 首次用TortoiseSVN Checkout 提示Unexpected HTTP status 405
    jQuery EasyUI -onblu、onkeyup等事件
  • 原文地址:https://www.cnblogs.com/xu-xiaofeng/p/7667621.html
Copyright © 2011-2022 走看看