• 经典排序算法


        最近在恶补算法,写一写经典的排序算法,先贴上各个复杂度对比图:

    1.冒泡法排序

    1 def bubble_sort(lists):
    2     count = len(lists)
    3     for i in range(count):
    4         for j in range(i+1,count):
    5             if lists[j] < lists[i]:
    6                 lists[i], lists[j] = lists[j], lists[i]
    7     return lists

    总结:
    最好情况:n-1次,时间复杂度为O(n)
    最坏情况:1+2+···+(n-1),时间复杂度为O(n2)

    2.简单选择排序

    def select_sort(lists):
        count = len(lists)
        for i in range(lists):
            m = i
            for j in range(i+1, count):
                if lists[j] < lists[min]:
                    m = j
            lists[i], lists[min] = lists[min], lists[i]
        return lists

    总结:
    最好情况和最坏情况一致:1+2+···+(n-1),时间复杂度为O(n2)

    3.插入排序

    def insert_sort(lists):
        count = len(lists)
        for i in range(1, count):
            key = lists[i]
            j = i - 1
            while j >= 0:
                if lists[j] > key:
                    lists[j+1] = lists[j]
                    lists[j] = key
                j -= 1
        return lists

    总结:
    最好的情况:排序本身就是有序的,时间复杂度为O(n)
    最坏的情况:排序是逆序,时间复杂度为O(n2)

    4.希尔排序

    def shell_sort(list):
        step = len(list)/2
        while step > 0:
            for i in range(step, len(list)):
                while i > step and list[i] > list[i-step]:
                    list[i], list[i-step] = list[i-step], list[i]
                    i -= step
            step = step/2
        return list

    总结:
    最好的情况和最坏的情况:时间复杂度为O(n*log2n)

    希尔排序的时间复杂度与step有关,但是没有证明出来。此结论与上表有区别,上表希尔排序的最优情况是改进的希尔排序或者是选择不同step的结果!

    5.堆排序

    def MAX_Heapify(heap,HeapSize,root):
        left = 2*root + 1
        right = left + 1
        larger = root
        if left < HeapSize and heap[larger] < heap[left]:
            larger = left
        if right < HeapSize and heap[larger] < heap[right]:
            larger = right
        if larger != root:
            heap[larger],heap[root] = heap[root],heap[larger]
            MAX_Heapify(heap, HeapSize, larger)
    def Build_MAX_Heap(heap):
        HeapSize = len(heap)
        for i in xrange((HeapSize -2)//2,-1,-1):
            MAX_Heapify(heap,HeapSize,i)
    def HeapSort(heap):
        Build_MAX_Heap(heap)
        for i in range(len(heap)-1,-1,-1):
            heap[0],heap[i] = heap[i],heap[0]
            MAX_Heapify(heap, i, 0)
        return heap

    总结:

    堆排序的时间复杂度为O(n*log2n),不稳定,不适合排序个数较少的情况

    6.并归排序

     1 def merge_sort(list):
     2     if len(list) <= 1:
     3         return list
     4     num = len(list)/2
     5     left = merge_sort(list[:num])
     6     right = merge_sort(list[num:])
     7     return merge(left, right)
     8 def merge(left, right):
     9     i,j = 0,0
    10     result = []
    11     while i < len(left) and j < len(right):
    12         if left[i] <= right[j]:
    13             result.append(left[i])
    14             i += 1
    15         else:
    16             result.append(right[j])
    17             j += 1
    18     result += left[i:]
    19     result += right[j:]
    20     return result

    总结:
    最好情况和最坏情况一样,时间复杂度都为O(n*log2n)

    7.快速排序

    def quick_sort(list, left, right):
        if left < right:
            return list
        list[left] = key
        low = left
        high = right
        while left < right:
            while left < right and list[right] >= key:
                right -= 1
            list[right], left[left] = list[left], left[right]
            while left < right and list[left] <= key:
                left += 1
            list[right], left[left] = list[left], left[right]
        pivot = left
        quick_sort(list, low, pivot-1)
        quick_sort(list, pivot+1, high)
        return list

    总结:
    最好情况:时间复杂度为O(n*log2n)
    最坏情况:时间复杂度为O(n2)
    空间复杂度为O(n*log2n) 

    8.基数排序

     1 import math
     2 def radix_sort(list, radix=10):
     3     k = int(math.ceil(math.log(max(a), radix)))
     4     bucket = [[] for i in range(radix)]
     5     for i in range(1, K+1):
     6         for val in list:
     7             bucket[val%(radix**i)/(radix**(i-1))].append(val)
     8         del a[:]
     9         for each in bucket:
    10             list += each
    11             del each[:]
    12     return list

    总结:
    最好情况:时间复杂度为O(d*(n+r*d))
    最坏情况:时间复杂度为O(d*(r+n))

    写在最后:

    安利一个神奇的东西,百度词条。

    各种语言版本的排序应有尽有,你值得参考!

    还安利一个博客:

    http://ahalei.blog.51cto.com/

    啊哈磊的博客,里面对各种算法的思想讲的很透彻,值得一看!

  • 相关阅读:
    多线程自动化运维linux的尝试 优化二
    多线程自动化运维linux的尝试 优化一
    多线程自动化运维linux的尝试
    mysql root 没有任何权限
    oracle hint 知多少
    pandas 实战笔记
    ICM issue IcmPlAllocBuf: MpiGetOutbuf failed (rc = 14 (MPI_ESTALE: outdated MPI handle))
    利用python在Oracle数据库中生成密码字典库
    nginx 配置的一些参数
    nginx四层代理
  • 原文地址:https://www.cnblogs.com/hbwxcw/p/6505687.html
Copyright © 2020-2023  润新知