zoukankan      html  css  js  c++  java
  • 常用的算法

    1冒泡排序,复杂度O(n2)最慢,效率最低

    临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,

    这样一趟过去后,最大或最小的数字被交换到了最后一位,

    然后再从头开始进行两两比较交换,直到倒数第二位时结束,以此类推比较第i次。。。

    list=[6,3,4,8,1,10]
    for i in range(len(list)):
        for j in range(1,len(list)-i):
            print i,j,list[j-1],list[j]
            if list[j-1] > list[j]:
                list[j-1],list[j]=list[j],list[j-1]     
            print list
    print list

    2选择排序,复杂度O(n2)

    每次遍历选择一个最值,和冒泡的区别在于交换的是位置,也就是脚标

    3插入排序复杂度O(n2)


    插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。

    4快速排序,复杂度O(nlogn) 

    对冒泡排序的改进,选出一个值,其他的数和这个值比较,比这个值小的都放在左边,比这个值大的都放在右边

    (1) 如果不多于1个数据,直接返回。
    (2) 一般选择序列最左边的值作为支点数据。
    (3) 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。
    (4) 对两边利用递归排序数列(算是很快的排序算法了,因为递归,所以耗内存)

    def quickSort(L, low, high):
        i = low 
        j = high
        if i >= j:
            return L
        key = L[i]
        while i < j:
            while i < j and L[j] >= key:
                j = j-1                                                             
            L[i] = L[j]
            while i < j and L[i] <= key:    
                i = i+1 
            L[j] = L[i]
        L[i] = key 
        quickSort(L, low, i-1)
        quickSort(L, j+1, high)
        return L
    L=[12, 6, 9, 7, 5, 11, 4, 8, 3, 10]
    print quickSort(L, 0, 9)
    #i=0,j=len(L)-1

    5堆排序复杂度O(nlogn) 

    堆排序适合于数据量非常大的场合(百万数据)。

    堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

    堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

  • 相关阅读:
    AutoLISP批量移动图元到指定图层
    AutoLISP实现同时绘制多条直线
    再测试下连接微博
    一个博士的论文致谢词
    AutoLISP实现橡皮筋绘图预览
    AutoLISP根据所选图元冻结图层
    AutoCAD中绘制箭头
    你是谁的流川枫
    AutoLISP反应器vlrobjectreactor函数应用
    AutoLISP实时跟踪鼠标坐标
  • 原文地址:https://www.cnblogs.com/xueli/p/4897552.html
Copyright © 2011-2022 走看看