快速排序

博客介绍了快速排序算法,需在数组中找“基准”,将小于和大于基准的元素分别放左右,各区域重复操作直至排好序。选择基准值方法多样,文中选数组中间元素。还给出了完整的C++和Python代码并加注释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.什么是快速排序

快速排序需要再数组中找到一个“基准”(pivot),然后将小于基准的元素按原相对位置放在基准值的左边,大于基准的元素按原相对位置放在基准的右边。依此类推,每一块区域再重复该操作,直到排好顺序。
在这里插入图片描述
选择基准值的方法有很多,可以选择第一个元素,也可以根据自己的需求选择相应位置的元素。我们的做法选择的是位于数组最中间的元素做为基准值。

注意:

图片源自:
https://commons.wikimedia.org/w/index.php?curid=1965827

我们下面使用了完整的C++、python代码加注释进行展示。

在这里插入图片描述

二.C++代码

#include<iostream>
using namespace std;
/*
快速排序:通过不断的切分来实现排序(不同于归并排序有规律的切分)
*/
//比较函数,小的数放在前面,改变<号为>号,则从大到小排序
template<typename E>
bool compare(E a,E b)
{
    return a<b;
}

//交换函数,a和b位置的元素互换
template<typename E>
void swap(E A[],int a,int b)
{
    int temp=A[a];
    A[a]=A[b];
    A[b]=temp;
}

//打印输出函数
template<typename E>
void print(E A[],int n)
{
    for(int i=0;i<n;i++)
    {
        if(i==n-1) cout<<A[i]<<endl;
        else cout<<A[i]<<" ";
    }
}

//找到基准值的位置并返回
template<typename E>
inline int findpivot(E A[],int i,int j)
{
    return (i+j)/2;
}

//以该基准值进行一轮快排,并返回基准值应该放置的位置
template<typename E>
inline int partition(E A[],int l,int r,E& pivot)
{
    do
    {
        /*
            从两端找到不符合条件的两个数并进行交换
            从前往后找到比基准值大的数,从后往前找到比基准值小的数
            交换它们两,使得小的数再左边,大的再右边
        */
        while(compare(A[++l],pivot));
        while((l<r) && (compare(pivot,A[--r])));
        swap(A,l,r);
    }while(l<r);
    return l;
}

//快速排序函数
template<typename E>
void qsort(E A[],int i,int j) //A为原数组,i为A初始位置下标,j为A末尾位置下标
{
    if(j<=i) return ;
    int pivotindex=findpivot(A,i,j);  //查找轴值(基准值),并返回其下标
    swap(A,pivotindex,j);  //将轴值换到数组末尾
    int k=partition<E>(A,i-1,j,A[j]);  //通过一轮快排返回轴值合适的位置下标
    swap(A,k,j); //将基准值放到合适的位置
    //基准值的左右两边再分别进行快排
    qsort<E>(A,i,k-1); 
    qsort<E>(A,k+1,j);
}

int main()
{
    int a[10]={2,4,3,6,9,0,1,6,4,5};
    cout<<"begin:";
    print(a,10);
    qsort(a,0,9);
    cout<<"end:";
    print(a,10);

    system("pause");
    return 0;
}

在这里插入图片描述

三.python代码

与C++代码类似

def qsort(A,i,j):
    if j<=i: 
        return ;
    pivot = findpivot(i,j)
    swap(A,pivot,j)
    k = partition(A,i,j-1,A[j])
    swap(A,k,j)
    
    qsort(A,i,k-1)
    qsort(A,k+1,j)

def partition(A,l,r,pivot):
    while 1:
        while compare(A[l],pivot):
            l+=1
        while compare(pivot,A[r]) and l<r:
            r-=1
        swap(A,l,r)
        if r<=l:
            break
    return l

def findpivot(l,r):
    return (l+r)//2

def compare(i,j):
    return i<j

def swap(A,i,j):
    m = A[i]
    A[i] = A[j]
    A[j] = m

def printA(A):
    for i in A:
        print(i,' ',end='')
        
def main():
    A = [4,3,5,6,1,2,0,8,7,9]
    print('begin:',end='')
    printA(A)
    qsort(A,0,9)
    print('\n  end:',end='')
    printA(A)
    
main()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比奇堡咻飞兜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值