蓝桥杯 经典算法题 实现快速排序

题目:

题解:

快速排序其实每次不是将大区间平均分为两个子区间(这个与每次选取的基准值有关),而是每次将区间分为全大于基准值和全小于基准值两个子区间,然后又分别在子区间中再找一个基准值再分为两个子区间如此往复最终将整个数组变得有序。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int arr[105]={0};
void quik_sort(int l,int r){
  if(r-l<=0)return ;
  else if(r-l==1){
    if(arr[r]<arr[l]){
      swap(arr[r],arr[l]);
    }
    return ;
  }
  int ind=arr[l];
  int x=l,y=r;
  while(x!=y){
    while(x!=y&&arr[y]>=ind)y--;
    swap(arr[y],arr[x]);
    while(x!=y&&arr[x]<ind)x++;
    swap(arr[y],arr[x]);
  }
  arr[x]=ind;
  quik_sort(l,x);
  quik_sort(x+1,r);
}

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

题后反思:

如何将一个数组变为两部分左半部分全部小于右半部分:

一个最简单朴素的方法是选择第一个值作为基准值并将第一个位置空出来,然后利用左右指针,当空位在左指针时用右指针找一个小于基准值的值与左指针交换,当空位在右指针时用左指针找一个大于等于基准值的值与左指针交换,知道左右指针重合然后将基准值填到这个位置上即可。

最后终止条件的判断:

第一写的是:

cpp 复制代码
if(r-l=0)return ;

然后一直报错找不到原因,因为当基准值本来因该填在最后一个位置时,x和y都指向序列的末尾,然后下一次调用时范围为(nums.size()-1,nums.size())是一个不合理的区间,这种情况因该停止排序,但是程序无法识别到,所以报错。因此要根据具体实现充分考虑因该终止时的情况。

相关推荐
时光の尘11 分钟前
C语言菜鸟入门·关键字·void的用法
c语言·开发语言·c++·算法·c#·c·关键字
蚂蚁没问题s12 分钟前
图像处理 - 色彩空间转换
图像处理·人工智能·算法·机器学习·计算机视觉
戊子仲秋24 分钟前
【LeetCode】每日一题 2024_11_21 矩阵中的蛇(模拟)
算法·leetcode·矩阵
HP-Patience28 分钟前
【机器学习】- 模型复杂度vs模型误差
python·算法·机器学习
螺旋天光极锐斩空闪壹式!36 分钟前
第十三课 二维数组(2)方向数组
开发语言·c++·算法
peter801540 分钟前
算法项目推荐
算法
小小白白蛆41 分钟前
剑指offer JZ51 数组中的逆序对
数据结构·算法·排序算法
十五年专注C++开发1 小时前
C++不完整类型(Incomplete Type)的检测与避免
开发语言·c++·算法·设计模式
eternal19951 小时前
优化算法|基于Deep-Q-Network(DQN)的邻域搜索算法求解分布式柔性作业车间调度问题
分布式·算法
清流君3 小时前
【运动规划】移动机器人运动规划与轨迹优化全解析 | 经典算法总结
人工智能·笔记·算法·机器人·自动驾驶·运动规划