c++ 快排思想

文章讲述了快速排序算法的思想,通过使用左右指针寻找适合的分割点来优化时间复杂度,最坏情况下的时间复杂度为O(n^2),平均为O(nlog2n)。在代码实现中,特别强调了比较元素的选择和交换顺序对算法效率的影响,以及如何进行中值选择来提高性能。

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

讲下思想

我这边主要是分左右两边的指针寻找
在这里插入图片描述

  • left指针从左边寻找大于p的数

  • right 从右寻找小于p的数

  • 然后找到进行交换,直到相遇在一起
    在这里插入图片描述

  • 说明这个位置是分隔的位置

  • 而p的数就是分隔的数,所以对p和l进行一个swap
    在这里插入图片描述

时间复杂度

最坏的情况为O(n^2)
平均为O(nlog2n)

优化

主要从对比元素的选择入手

  • 最后交换, 这边必须从右往左开始,不然出问题
  • 因为从右就会寻找到比左边小的临界值,从左会寻找到大于的临界值,到时候交换会出问题,这个根据选择的对比标准来的

代码实现

#include <vector>
#include "quicksort.h"
#include <iostream>
#include <QDebug>
using namespace std;

int get_middle(vector<int>& arr, int start, int end) {
    if(end == start) return end;
    int middle = (end - start)/2;
    if(arr[start] > arr[middle]){
        swap(arr[start], arr[middle]);
    }
    if(arr[middle] > arr[end]) {
        swap(arr[middle], arr[end]);
    }

    return middle;
}
void quickSort(vector<int>& arr, int l, int r) {
    //[11, 2, 33, 2, 3, 4]
    //中值选择

    if(l >= r) return;
    int i, j;

    i = l;
    j = r;
    int povit = l;
    while(i < j) {

        while(arr[j] >= arr[povit] && i < j) {
            j--;
        }
        while(arr[i] <= arr[povit] && i < j) {
            i++;
        }
        swap(arr[j], arr[i]);

   }

    swap(arr[i], arr[povit]);

    qDebug() << "排完结果" << arr;
    quickSort(arr, l, i - 1);
    quickSort(arr, i + 1, r);


}

#include "widget.h"

#include <QApplication>
#include <QDebug>
#include <memory>
#include <vector>
#include "quicksort.h"
#include <iostream>

//extern void quick_sort(int* arr, int low1, int high1);
using namespace std;
class Solution {

public:
    bool checkXMatrix(vector<vector<int>>& grid) {

        int n = grid.size();
        //判断对角线
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(i==j|| j== n-i-1){
                    if(grid[i][j] == 0) {qDebug()<<i<<j; return false;};
                } else {
                    if(grid[i][j] != 0) {qDebug()<<i<<j; return false;};
                }
            }

        }
        return true;
    }
};
int main(int argc, char *argv[])
{
    vector<int> v3 = {1,49,38,4,97,32,13,27,42 };
    int length = v3.size();
    qDebug() << v3;

    quickSort(v3, 0, length - 1);
    qDebug() <<"res" << v3;
    return 0;
//    Solution so;
//    bool su = so.checkXMatrix(v1);
//    vector<int> v3 = {1,49,38,4,97,32,13,27,49 };
//    quickSort(v3);

}
//快速排序




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东哥aigc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值