快速排序(手动SORT)简单理解

一.简介

有STL的sort了谁还手打啊?(bushi

快速排序在某一种程度上是极快的(好像有点怪?

二. 原理

何为快速排序?不就是就是SORT吗?但是手打出来还是很有必要的

快速排序本质上是一种分治算法

其原理是 把数组中一个数(可以随机)作为一个flag 把比它小的放在它右边把比它大的放在左边 然后我们再把这个数组分成两部分 在这两部分里 分别再找一个flag 再把这两个数组里面 小的大的分在两边。我们递归处理到底层 就可以把整个数组变成有序的。

三.代码

#include<bits/stdc++.h>
using namespace std;
int f[100000];
inline void quick_sort(int l,int r){
    if(l>=r) return;
    int spl=rand()%(r-l+1)+l;//随机化优化,确保随机spl在[l,r]的区间内
    swap(f[l],f[spl]);
    int flag=f[l];
    int i=l,j=r;
    while(i<j){
        while(i<j&&f[j]>=flag) j--;
        while(i<j&&f[i]<=flag) i++;
        if(i==j) swap(f[i],f[l]); 
        else swap(f[i],f[j]);
    }
   quick_sort(l,i-1);
    quick_sort(j+1,r); 
}
int main(int argc,char** argv){
    int sze;
    cin>>sze;
    for(register int i=1;i<=sze;i++) cin>>f[i];
    quick_sort(1,sze);
    for(register int i=1;i<=sze;i++) cout<<f[i];
    return 0;
}

四.提醒

快速排序 的时间复杂度 是 O(nlogn) 最差情况下会 退化成 O(n^2)

如何优化?可以使用随机化 我们并不需要呆呆的每次都选择第一个作为 flag

随机化优化已经在代码里体现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值