Python算法实现(一)—— 快速排序算法

欢迎关注公众号K的笔记阅读博主更多优质学习内容
K的笔记公众号

快速排序是我们在面试时常常遇到的算法,我们接下来首先介绍快速排序的基本思想,然后手撸一遍快速排序算法,最后我们介绍一些特殊情景的应用。

快速排序介绍

快速排序算法是冒泡排序算法的一种改进,其主要思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分所有数据小,整个过程可以递归进行,最终使整个数据变成有序序列。但快速排序是一种不稳定的排序算法,即相同元素不能保序,因此在一些实际场景中不能进行使用。

快排实现步骤

  1. 在数据集之中,选择一个元素作为“基准”(pivot)
    · 可以选择第一个元素或随机选择一个元素,但最好随机选择
    · 算法最坏情况复杂度为 O ( n 2 ) O(n^2) O(n2),平均复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),其中 n n n 为 partition 操作, l o g n logn logn 为树的深度
  2. 所有小于“基准”的元素,都移到“基准”的左边;所有大于“基准”的元素,都移到“基准”的右边。这个操作称为”分区“(partition)
    · 分区操作结束后,基准元素所处的位置就是最终排序后它的位置
    · partition 操作有两种方法:挖坑法和指针交换法
  3. 对“基准”左边和右边两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止

Partition 操作

下图是 Partition 操作的主要方式,下面分别介绍两种方法 —— 挖坑法和指针交换法。

挖坑法

挖坑法

首先我们的数组元素排序如下:
数组元素
首先我们选定基准元素Pivot,并记住这个位置index,这个位置相当于一个“坑”,并且设置两个指针 left 和 right ,指向数列的最左和最右两个元素。

第一步
接下来,从right指针开始,把指针所指向的元素和基准元素做比较。如果比pivot大,则right指针向左移动;如果比pivot小,则把right所指向的元素填入坑中。两个指针接触时算法停止。

4>2,所以4的位置不变,将right指针左移继续比较,right右边黄色的区域代表着大于基准元素的区域。

1<2,所以把1填入基准元素所在位置,也就是坑的位置。这时候,元素1本来所在的位置成为了新的坑。同时,left向右移动一位。

此时,left左边绿色的区域代表着小于基准元素的区域,接下来,我们切换到left指针进行比较。如果left指向的元素小于pivot,则left指针向右移动;如果元素大于pivot,则把left指向的元素填入坑中。

第二步
下面是挖坑法另一个例子,来自这篇博客
在这里插入图片描述

指针交换法

指针交换法的思想是同时遍历左右边,交换不满足条件的两个元素,下面的例子同样来自这篇博客

在这里插入图片描述由于上面的图片讲的已经很清楚了,这里就不再进行讲解,下面直接上代码。

快速排序代码实现

下面提供一个最简单的实现,想要寻求刺激的可以直接看下一节。

import random

def quickSort(arr):
    if len(arr) < 2:
        return arr
    pivot = arr[random.randint(0,9)]
    left, right = [], []
    arr.remove(pivot)
    for item in arr:
        if item >= pivot:
            right.append(item)
        else:
            left.append(item)
    return quickSort(left) + pivot + quickSort(right) 

快速排序的应用

我们首先看到 leetcode 的215题:

Leetcode
这个题我们可以用快速排序的思维来解题。我们在进行快速排序时,每进行一次 Partition,我们就能知道该基准元素的最终位置,因此我们只需要找到排名第二的元素即可,我们来看一下这个题的代码:

class Solution(object):
    def findKthLargest(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        self._k = len(nums) - k
        return self.quickSort(nums, 0, len(nums)-1)
        
    def quickSort(self, nums, left, right):
        if left == right:
            return nums[left]
        pivot = self.partition(nums, left, right)
        if pivot == self._k:
            return nums[pivot]
        elif pivot < self._k:
            return self.quickSort(nums, pivot+1, right)
        else:
            return self.quickSort(nums, left, pivot-1)
        
    def partition(self, nums, left, right):
        pivot = nums[left]
        i, j = left, right
        while i < j:
            while i < j and nums[j] >= pivot:
                j -= 1
            if i < j:
                nums[i] = nums[j]
                i += 1
            while i < j and nums[i] <= pivot:
                i += 1
            if i < j:
                nums[j] = nums[i]
                j -= 1
        nums[i] = pivot
        return i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python ,你可以使用内置的 `sorted` 函数来对列表进行排序。例如: ```python numbers = [3, 4, 2, 1] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用列表的 `sort` 方法来对列表进行排序。与 `sorted` 函数不同的是,`sort` 方法是在原地对列表进行排序,也就是说不会返回一个新的列表,而是直接修改原来的列表。例如: ```python numbers = [3, 4, 2, 1] numbers.sort() print(numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用 Python 的 heapq 库的堆排序算法。堆排序是一种速度较快的排序算法,特别适用于海量数据的排序。例如: ```python import heapq numbers = [3, 4, 2, 1] heapq.heapify(numbers) # 将列表转化为堆 sorted_numbers = [] while numbers: sorted_numbers.append(heapq.heappop(numbers)) # 将堆最小的数取出并放到结果列表 print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 此外,Python 还提供了许多其他的排序算法,例如快速排序、归并排序等。你可以使用 Python 的 timeit 库来对不同的排序算法进行测试,以找出最快的排序算法。 ### 回答2: 数据结构是计算机科学非常重要的一个概念,它是一种组织和存储数据的方式。而实现排序算法数据结构的一个重要应用。 在Python,可以使用多种数据结构实现排序算法,比如列表、数组和堆等。下面我将介绍一种常用的排序算法——插入排序的Python实现。 插入排序是一种简单且常用的排序算法,它的基本思想是将待排序的元素一个一个地按照大小插入到已经排好序的列表。具体步骤如下: 1. 创建一个新的空列表,作为存放已排序元素的容器。 2. 遍历待排序的列表,依次取出每个元素。 3. 将取出的元素与已排序元素的最后一个元素比较,如果取出的元素较小,则将它插入到已排序元素的末尾;如果取出的元素较大,则向前比较,找到合适的位置插入。 4. 重复步骤3,直到待排序列表的所有元素都被取出并插入到已排序列表。 5. 返回已排序的列表,即为排序结果。 下面是插入排序的Python实现代码: ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` 通过调用`insertion_sort`函数,传入待排序的列表,即可得到排序结果。 这就是数据结构一种常用排序算法——插入排序的Python实现。当然,除了插入排序,还有许多其他排序算法也可以使用Python实现,比如冒泡排序、快速排序等。每种排序算法都有其特点和适用场景,可以根据具体需求选择合适的排序算法来使用。 ### 回答3: 数据结构是计算机存储、组织和管理数据的方式。在Python,可以使用不同的数据结构实现排序算法。 常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、堆排序和归并排序等。 冒泡排序是一种比较简单的排序算法,它重复地交换相邻的元素,直到整个序列有序为止。可以使用列表作为数据结构实现冒泡排序。 插入排序是一种较为直观的排序算法,它将未排序的元素逐个插入到已排序的部分,构建有序序列。也可以使用列表实现插入排序。 选择排序是一种简单直观的排序算法,它每次选择未排序部分的最小元素,并将其与未排序部分的最左边元素交换位置。同样可以使用列表来实现选择排序。 快速排序是一种常用的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列。同样可以使用列表作为数据结构实现快速排序。 堆排序是一种利用堆的数据结构来进行排序的算法,它通过不断地构建和调整堆来达到排序的目的。可以使用列表来实现堆排序。 归并排序是一种稳定的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列,然后将两个有序子序列合并为一个有序序列。同样可以使用列表来实现归并排序。 总的来说,Python提供了多种数据结构算法实现排序操作,根据实际需求和性能要求选择适合的算法数据结构

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值