首页 > 编程语言 >算法学习笔记五一快速排序

算法学习笔记五一快速排序

时间:2023-12-23 22:47:03浏览次数:51  
标签:right list 算法 数组 quick 排序 五一 left

目录

什么是快速排序

快速排序(Quicksort)是一种常用的排序算法,它的基本思想是通过分治的策略将一个大问题划分为多个小问题来解决。它的平均时间复杂度为O(nlogn),最坏情况(有序情况)为O(n^2)。是一种高效的排序算法。

算法思想

  1. 选择一个基准元素(pivot),可以是数组中的任意一个元素。通常情况下,可以选择第一个元素、最后一个元素或者随机选择。
  2. 将数组划分为两个子数组:小于等于基准元素的元素放在基准元素的左边,大于基准元素的元素放在右边。这个过程称为分区(partition)操作。
  3. 对两个子数组分别递归地应用快速排序算法,直到子数组的大小为0或1,此时子数组已经有序。
  4. 合并排序后的子数组,即得到最终的排序结果。

示例代码

def partition(list, left, right):
    temp = list[left]
    while left < right:
        while list[right] > temp and left < right:  # 先遍历mid右边的数组,找到一个比temp小的数
            right -= 1
        list[left] = list[right]
        while list[left] < temp and left < right:  # 再遍历mid左边的数组,找到一个比temp大的数
            left += 1
        list[right] = list[left]
    list[left] = temp
    return left  # 结束循环时,left=right


def quick_sort(list, left, right):
    if left < right:
        mid = partition(list, left, right)
        quick_sort(list, left, mid - 1)
        quick_sort(list, mid + 1, right)

下面介绍一种python实现比较方便的写法:

def quick_sort(list):
    if len(list) <= 1: # 当递归的数组只有一个时
        return list
    else:
        pivot = list[0]
        less = [x for x in list[1:] if x <= pivot]
        greater = [x for x in list[1:] if x > pivot]
        return quick(less) + [pivot] + quick(greater)

标签:right,list,算法,数组,quick,排序,五一,left
From: https://www.cnblogs.com/chase-youth/p/17923772.html

相关文章

  • 将 n 个整数由小到大排序
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ intarr[10]; printf("请输入一串数字:\n"); for(inti=0;i<10;i++) { scanf("%d",&arr[i]); } for(inti=0;i<10;i++)//循环次数等于元素 { for(intj=......
  • 代码随想录算法训练营第十一天|20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150
    一、20.有效的括号题目链接:LeetCode20.有效的括号学习前:思路:当前元素为左括号,直接入栈当前元素为右括号,若找到对应的左括号匹配,则循环继续;反之返回false若栈为空,返回true;反之false时间复杂度:O(n)空间复杂度:O(n)学习后:采用入栈右括号,降低复杂度。即当遇到左......
  • 字节国际化TnS算法实习的碎碎念
    Motivation在保研之后,我和南大的导师投了一篇个性化联邦学习的CVPR作为毕设。之后感觉就没什么事了,于是想着找个实习吧,第一个想法就是去字节实习,也只投了字节(别学我,还是多投一些哈哈,找不到实习就g了)。面试过程因为是日常实习,所以就是两轮技术加一轮hr面,虽然师兄说比较简单,但我......
  • Java数组常见的几种排序。
    publicclasscode2{publicstaticvoidmain(String[]args){int[]x={37,89,23};for(intz=0;z<x.length-1;z++){intminIndex=z;for(inti=z+1;i<x.length;i++){if(......
  • 排序
    本来我们最开始是想把序列的操作转化为单点操作的想一下我们遇到过的序列转单点的方法:差分、前驱后继所以这题本来想用差分的,但是排了序之后差分数组是无法确定的(可以手动模拟样例就知道为啥无法确定了)然而这题目还给了我们一个提示:只需要知道最后时刻第\(q\)个位置上的数所以......
  • 关于Secure Hash Algorithm加密算法
    一、概述SHA(SecureHashAlgorithm)加密算法是一种广泛应用的密码散列函数,由美国国家安全局(NSA)设计,用于保障数据的安全性和完整性。SHA算法经历了多个版本的更新,目前主要应用于各种网络安全和数据加密领域。SHA在线加密|一个覆盖广泛主题工具的高效在线平台(amd794.com)http......
  • 机器学习-无监督机器学习-kmeans衍生的算法-18
    目录1.k-Medoids2.二分KMEANS3.KMeans++4.elkanKMeans5.minbatchKMeans算法6.小结:1.k-Medoids之前的kmeans算法对于异常点数据特别敏感,更新中心点的时候,是对于该簇的所有样本点求平均,这种方式对于异常样本特别敏感,kmedoids算法克服这个问题,实现方式所有属于该簇的样......
  • 二叉树的查找算法的实现与运用
    二叉树的查找算法的实现与运用这里我们需要运用到之前二叉树建立的知识点每一次调用Insert函数时,都会开辟一个BiNode类型的空间,同时递归调用。其次,我们在建立平衡二叉树时,当前节点的左结点小于该结点,当前节点的右结点大于该结点,所以,我们在递归之前添加了一个判断条件。最后,Inser......
  • Python算法——树的直径
    Python中的树的直径算法详解树的直径是树中任意两个节点之间最长路径的长度。在本文中,我们将深入讨论树的直径问题以及如何通过深度优先搜索(DFS)算法来解决。我们将提供Python代码实现,并详细说明算法的原理和步骤。树的直径树的直径定义为树中任意两个节点之间最长路径的长度。这个......
  • 【洛谷 P1781】宇宙总统 题解(高精度+结构体排序)
    宇宙总统题目描述地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。输入格式第一行为一个整数,代表竞选总统的人数。接下来有行,分别为第一个候选人到第个候选人的票数。输出格式共两行,第一行是......