基础算法之快速排序算法

本文详细解析了快速排序(Quick Sort)和归并排序(Merge Sort)的基本原理,介绍了不使用额外内存的改进方法,并提供了C++代码实例。通过递归和指针操作展示如何在空间效率上提升排序算法

基础算法之排序算法

基础的排序算法分为快排和归并排序还有桶排,堆排等等这些不是我们主要的讨论内容,我们这次主要是讲快排和归并。
我们先从快排开始:1.快排的主要思想是基于分治来做的。首先我们在数组中任意取一个点,这个点可以是左右的端点也可以是区间的中值点,就是任意一点。
2.确定完分界点之后就可以调整区间了,令分界点为X吧,小于等于X的值放在X的左边,大于X的值放在右边,保证这个条件成立即可,如果相等的话在左边还是右边都是可以的。
3.最后使用递归的方法处理左右两端,然后排好序之后两个部分合在一起就是这整个数组的排序。
以上是整体的一个大概思想。
我们可以利用这个思想写一个最容易想到的方法:同时开辟两个新的数组内存(取名a数组,b数组),然后取一个数X,然后让他们依次和X进行对比,如果数大于X就存倒b数组中如果小于X存入a数组中,如果相等存入任意一个数组即可(任意一个指a数组或b数组)。然后再用递归的方法排序,然后将两个数组拼接在一起即可。
然而我们还有一种更好的方法不需要开辟多余的内存而且时间的复杂度也不变,下面我将详细的讲述一下这个方法:
首先,先声明两个指针,这两个指针分别从数组的两端向中间靠拢,,具体就是两个指针一个指向第一个元素,第二个指针指向数组的最后一个元素,然后让两个指针分别向中间靠拢,每指向一个数就让它和选取的X进行大小比较如果比X大应该放在右边就先,然后停下来不动,等右端的指针指向了一个比X小的数需要放到X的左边,这时将两个指针所指向的数进行交换,交换结束后让指针指向交换位置的下一个位置,遇到相等的数可以不交换,两个指针相遇停下即可。读者请仔细研读上述内容,理解最好。

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

以上是快速排序的代码模板可以帮助理解

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值