• 八大排序算法的python实现(四)快速排序


    代码:

    #coding:utf-8
    #author:徐卜灵
    #交换排序.快速排序
    # 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法:
    # import sys
    # sys.setrecursionlimit(150000)
    L = [6, 3, 2, 32, 5, 4]
    
    def Fast_sort(L, left,right):
        if left >= right:
            return L
        key = L[left]
        low = left
        high = right
        while left < right:
            # if L[right] > key:
            #     right-=1
            # else:
            #     L[left] = L[right]
            # if L[left] <= key:
            #     left += 1
            # else:
            #     L[right] = L[left]
            # L[left] = key
            while left < right and L[right] >= key:
                right -= 1
            L[left] = L[right]
            while left < right and L[left] <= key:
                left += 1
            L[right] = L[left]
        L[left] = key
        Fast_sort(L, low, left - 1)
        Fast_sort(L,left + 1,high)
        return L
    print Fast_sort(L,0,5)
    
    # 1.高质量代码
    # def quick_sort(lists, left, right):
    #     # 快速排序
    #     if left >= right:
    #         return lists
    #     key = lists[left]
    #     low = left
    #     high = right
    #     while left < right:
    #         while left < right and lists[right] >= key:
    #             right -= 1
    #         lists[left] = lists[right]
    #         while left < right and lists[left] <= key:
    #             left += 1
    #         lists[right] = lists[left]
    #     lists[left] = key
    #     quick_sort(lists, low, left - 1)
    #     quick_sort(lists, left + 1, high)
    #     return lists
    # print quick_sort(L,0,5)
    
    
    #2.高质量代码
    # # 设置最低位和最高位
    # def quickSort(nums, low, high):
    #     # 设置一个比较基准key
    #     key = nums[low]
    #     while low<high:
    #         # 如果最高位的数 大于等于 key则向前走
    #         while low<high and nums[high] >= key:
    #             high -= 1
    #         # 如果最低位的数 小于等于 key则向后走
    #         while low<high and nums[low] <= key:
    #             low += 1
    #         # 交换值
    #         nums[low], nums[high] = nums[high], nums[low]
    #
    #     #最后low=high, 此时交换key和high位上的值, 使小于key的值在key左边, 大的在key右边
    #     nums[nums.index(key)], nums[low] = nums[low], nums[nums.index(key)]
    #     # 返回最低位的位置
    #     return low
    #
    #
    # # 进行重复操作
    # def interval(nums, low, high):
    #     if low<high:
    #         # 进行排序并得到最低位位置以循环操作
    #         key_index = quickSort(nums, low, high)
    #         interval(nums, low, key_index)
    #         interval(nums, key_index+1, high)
    #
    #
    # nums = [64,3,9,2,4,7,0,12,45,]
    # interval(nums, 0, len(nums)-1)
    # print nums
    #

    算法理解上没有什么问题,问题在算法实现上。特别注意的是几个索引,low 和 high 做一下缓存。

    另外,在用递归的时候,一定注意迭代停止的判断条件。我在写代码的时候就一直忘了加判断条件,结果总是提示错误。一个简单的错误就搞这么久。

    时间复杂度:O(nlogn)

    空间复杂读:O(nlogn)

    非稳定排序算法。

    大多数情况下的最优选的排序算法,时间复杂度低嘛。

  • 相关阅读:
    JZOJ5906 传送门
    JZOJ5907 轻功
    JZOJ5904 刺客信条
    JZOJ5347 遥远的金字塔
    JZOJ5344 摘果子
    JZOJ4742 单峰
    JZOJ4725 质数序列
    JZOJ2499 东风谷早苗
    JZOJ4737 金色丝线将瞬间一分为二
    最后的财产——模板大全
  • 原文地址:https://www.cnblogs.com/xubing-613/p/7286268.html
Copyright © 2020-2023  润新知