Python|简单的快速排序

简介: Python|简单的快速排序

问题描述

快速排序作为排序算法中平均花费时间最少的排序算法,在各自比赛中,经常被用来处理排序问题。

解决方案

今天来带大家理解快速排序的原理及python代码实现。快排思路:选取一个数base(方便理解选取数组第一个数),比这个数小的移到这个数左边,比这个数大的移到这个数右边。

算法思路:

1.选取一个数作为base,并选取左右指针leftright。

2.left指针每次向右移动1,找到比base大的数.right指针每次向左移动1,找到比base小的数。然后将left指针与right指针对应的数交互位置。(这样比base小的数就移到数组左边,大的就去了右边)

图 1 步骤1

图 2 步骤2

3.left指针等于right指针,如果这个数小于base就与base交换,如果大于base就与left-1对应的数交换。

图 3 步骤3

4.base左边的数组和右边的数组代入步骤1234,直到数组有序。

快排代码解析:

按照最简单的思路(选取一个数base,比这个数小的移到这个数左边,比这个数大的移到这个数右边。),先来实现一个简单的伪快排代码,来帮助更好的理解快速排序。

def quick_sort(array):

    if len(array)<2:

        return array

    else:

        # 选取base

        base=0

        base_val=array[0]

        # base_val小的数组成一个数组

        less_base = [i for i in array[base + 1:] if i <=base_val]

        # base_val大的数组成一个数组

        more_base = [i for i in array[base + 1:] if i > base_val]

        # base_val左右两个数组执行同样操作,然后再与base+val拼接

        return quick_sort(less_base)+[base_val]+quick_sort(more_base)

测试结果:

图 4 测试结果1  

很简单的代码便实现了伪快速排序,至于为什么是伪代码,因为不是对原数组进程操作,而是每次用两个额外的数组储存比base大的和小的,并且函数每运行一次,需要对传入的数组进行两次遍历。

时间和空间复杂度增加的比较多,实在对不上快速排序这个名字。但确实符合了快排的思想,接下来来看看完整的快排代码怎么写吧。

完整的快排代码

根据前文提到的算法思路,每次leftright的移动交换都要在原数组中进行。可以将这部分代码封装为一个函数。

因为需要将原数组从逻辑上划分为多个数组,所以replace_val函数需要传入这些逻辑上划分的数组的开始和结束位置,而不是base,left,right的值,这些值都可以从begend得到。

def replace_val(array,beg,end):

    base=beg

    base_val=array[base]

    left=base+1

    right=end

    while True:

        '''        为了防止传入的数组只有2个元素,left=base+1直接与right重合,然后就移动下标的位置,所以先判断

        '''

        # leftright重合

        if right <= left:

            if array[right] < base_val:

                array[base], array[right] = array[right], array[base]

            else:

                array[base], array[right + 1] = array[right + 1], array[base]

            break

        # leftright未重合

        if array[left]>array[right]:

            array[left], array[right] = array[right], array[left]

        # left<right并且array[left]base_val小就继续移动

        while left<right and array[left]<=base_val:

            left+=1

        # right>left并且array[right]base_val大就继续移动

        while right>=left and array[right]>base_val:

            right-=1

    return right

之后就是将执行了一次replace_val函数的数组拆成2部分再来一次。然后再拆,对每一部分,再执行replace_val函数。

def quilck_sort(array,beg,end):

    #beg<end,表示begend最少有2个数,才需要进行排序

    if beg<end:

        ind=replace_val(array,beg,end)

        quilck_sort(array,beg,ind-1)

        quilck_sort(array,ind+1,end)

测试结果:

图  5 测试结果2

目录
相关文章
|
20天前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
32 1
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
7月前
|
搜索推荐 Python
PYTHON的快速排序
PYTHON的快速排序
51 0
|
5月前
|
搜索推荐 Python
快速排序:Python 中的速度之王,揭秘它的递归魔法与性能极限!
【7月更文挑战第12天】快速排序**是高效排序算法,基于分治策略。它选择基准值,将数组分成小于和大于基准的两部分,递归地对两部分排序。
62 6
|
5月前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
【7月更文挑战第12天】Python的快速排序**以分治策略实现高效排序,平均时间复杂度$O(nlogn)$,优于$O(n^2)$的冒泡排序。基本实现通过选取基准元素分割数组,然后递归排序两部分。优化版使用随机基准避免最坏情况。对比显示优化后排序更稳定,适应不同数据集,提升程序性能。
60 4
|
5月前
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
57 3
|
6月前
|
搜索推荐 算法 Python
Python教程:使用Python实现冒泡排序和快速排序
排序算法根据其实现原理和效率可以分为多种类型,包括冒泡排序、选择排序、插入排序、归并排序、快速排序等。这些算法在不同的场景下具有不同的优劣势,需要根据实际需求选择合适的算法。
65 3
|
5月前
|
搜索推荐 Python
python实现冒泡排序、快速排序
python实现冒泡排序、快速排序
|
7月前
|
搜索推荐 算法 Python
python快速排序和冒泡排序
python快速排序和冒泡排序
50 8
|
7月前
|
算法 搜索推荐 C++
Python 快速排序:原理、使用场景与实现方法
本文主要介绍了Python 快速排序:原理、使用场景与实现方法
100 5