美文网首页
【快速排序】912--排序数组

【快速排序】912--排序数组

作者: 何几时 | 来源:发表于2021-07-16 22:39 被阅读0次

错误做法

import random

class Solution:
    def sortArray(self, nums):
        # corner case
        if len(nums) == 0:
            return nums

        # 快速排序
        left = 0
        right = len(nums) - 1
        self.dnc(nums, left, right)

        return nums

    def dnc(self, nums, left, right):
        # 结束条件
        if left >= right:
            return

        # 递归拆解
        mid = self.get_mid(nums, left, right)
        self.dnc(nums, 0, mid - 1)
        self.dnc(nums, mid + 1, right)

    def get_mid(self, nums, left, right):
        r = random.randint(left, right)
        pivot = nums[r]
        nums[r], nums[left] = nums[left], nums[r]
        while left < right:
            while nums[right] >= pivot and left < right:
                right -= 1
            nums[left] = nums[right]
            while nums[left] <= pivot and left < right:
                left += 1
            nums[right] = nums[left]
            nums[left] = pivot

        return left

错误解析:
因为循环的每一轮,左右边界都会被当成给移动指针,于是左右边界不固定

正确写法

从这里看懂:https://www.bilibili.com/video/BV1mE411M7SH?from=search&seid=3750218521433931722
再边换成分治算法模板

import random


class Solution:
    def MySort(self , arr ):
        # corner case
        if len(arr) == 0:
            return arr
        
        # 边界设定
        left = 0
        right = len(arr) - 1
        # 放入dnc函数递归,快排是原地排序
        self.dnc(arr, left, right)
        # 返回
        return arr
    
    def dnc(self, arr, left, right):
        # 终止条件
        if left >= right:
            return
        
        # 递归拆解
        index = random.randint(left, right)
        pivot = arr[index]
        arr[index], arr[left] = arr[left], arr[index]
        i, j = left, right
        while i < j:
            while arr[j] > pivot and i < j:
                j -= 1
            arr[i] = arr[j]
            while arr[i] <= pivot and i < j:
                i += 1
            arr[j] = arr[i]
        arr[i] = pivot
        self.dnc(arr, left, i-1)
        self.dnc(arr, i+1, right)

相关文章

  • 【快速排序】912--排序数组

    错误做法 错误解析:因为循环的每一轮,左右边界都会被当成给移动指针,于是左右边界不固定 正确写法 从这里看懂:ht...

  • 数组排序

    数组排序 sort排序 冒泡排序 快速排序 插入排序

  • PHP排序算法

    排序算法 冒泡排序(数组排序) 快速排序(数组排序) 参考 http://www.cnblogs.com/enia...

  • 算法记录

    快速排序 基本算法: 归并排序讲数组分为两个子数组分别排序,并将有序的子数组归并使得整个数组排序; 快速排序通过一...

  • 数组相关处理函数2

    冒泡排序法 快速排序法 数组排序函数 ksort 对数组按照键名排序 krsort 键名降序排序 asort 对数...

  • 排序算法

    冒泡排序 选择排序 插入排序 归并排序 快速排序 数组内置方法

  • 数组-快速排序

    采用快速方式对数组进行排序 快速排序百科:快速排序(Quicksort)是对冒泡排序算法的一种改进.快速排序是通过...

  • 算法系列笔记(六)快速排序

    快速排序 快速排序和归并排序有点像,快速排序将一个数组分成两个子数组,将两部分独立排序,,而且通过迭代的方式不断进...

  • 快速排序

    快速排序算法思想 快速排序和归并排序是互补的,归并排序将整个数组分成小数组,然后将排好序的小数组归并以将整个数组排...

  • JS面试算法题

    数组快速排序 数组去重

网友评论

      本文标题:【快速排序】912--排序数组

      本文链接:https://www.haomeiwen.com/subject/gfcipltx.html