常用的算法

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) 

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

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

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

 

posted @ 2015-10-21 13:50  米 立  阅读(220)  评论(0编辑  收藏  举报