【排序算法】快速排序

快速排序

采用"分治"的思想,对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素。

通过第一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边。

再有同样的方法递归排序这两部分,直到序列中所有数据均有序为止。

实例

对数组3,7,1,6,4,9,2进行快速排序。

一律将基准元素取为第一个元素。

设置左右指针辅助排序。

初始,base=3,左指针指向3,右指针指向2。

先让右指针从后往前走,如果指向的元素小于base,则用r的元素替代l位置的元素。右指针保持不动,左指针从左往右移动,当左指针指向数值大于base时,把l指向的元素替换给r。接着右指针再往前移动,重复以上操作直至两指针相遇。

如图,右指针指向2,小于base,把r指向的值替换给l。得到下图数组。

如图,完成了数值的替换。

接着,左指针从左到右移动,到7位置发现7>base,把l指针的元素替换给r。

右指针从后往前移动,移到1时,发现1<base,把r指向的元素数值替换给l。

左指针从左往右移动,移到下一个1与右指针重合。将base替换到指针重合指向的位置。

最后得到第一列排序结果。

后续步骤即将3的左右子数组进行上述相同的排序处理。

代码实现

cpp 复制代码
#include <iostream>

using namespace std;
const int N = 1000010;
int q[N];


void quicksort(int q[], int l, int r){
    if(l < r){
        int base = q[l];
        int left = l;
        int right = r;
        while(left < right){
           while(left < right && q[right]>= base){
            right--;
            }
        q[left] = q[right];
            while(left < right && q[left]<=base){
            left++;
            }
        q[right] = q[left]; 
        }
        q[left] = base;
        //cout<<left<<endl;
        quicksort(q, l, left-1);
        quicksort(q, left+1, r);
    }
     
}

int main(){
    int n;
    cin>>n;
    
    int i;
    for(i =0; i<n; i++){
        cin>>q[i];
    }
    
    quicksort(q, 0, n-1);
    
    for(i =0; i<n; i++){
        cout<<q[i]<<" ";
    }
    
    return 0;
    
    
    
}

或者使用stl

cpp 复制代码
sort(q, q+n);
相关推荐
余生皆假期-1 小时前
傅里叶变换和拉普拉斯变换
人工智能·算法·机器学习
数模竞赛Paid answer2 小时前
2026年五一杯数学建模C题边坡预警问题求解全过程文档及程序
算法·数学建模·五一杯
hold?fish:palm2 小时前
20 旋转图像
c++·算法·leetcode
NoteStream2 小时前
【C语言基础】分支和循环(上)
c语言·开发语言·c++·经验分享·笔记·算法·c#
白狐_7983 小时前
408数据结构第7章:查找②——顺序、折半、分块查找秒杀 + 真题
数据结构·算法
卷心菜的学习路3 小时前
基于多模态向量检索的数学相似题推荐系统:完整设计、算法与实验
java·python·算法·大模型·推荐算法·数学相似题
小南知更鸟3 小时前
【leetcodehot100】leetcode-hot100-20260809更新
算法·leetcode·职场和发展
数模竞赛Paid answer3 小时前
2021年深圳杯数学建模A题火星探测器着陆控制方案解题全过程论文及程序
算法·数学建模·深圳杯
hold?fish:palm3 小时前
19 螺旋矩阵
线性代数·算法·矩阵
码完就睡4 小时前
数据结构——树、二叉树基础概念
数据结构·算法