算法基础之快速排序

快速排序

  • 主要思想:分治

    • 1.确定分界点 (不一定是x)
    • 2.调整范围 左侧<=x 右侧>=x
    • 3.递归 处理左右两段
  •   #include<iostream>
      using namespace std;
      const int N=1e6+10;
      int n;
      int p[N];
      void quick_sort(int p[], int l,int r){
          if(l>=r) return; 
          //即数组中没有数据 直接返回
          //也可以写成l==r
          int x=p[l+r>>1],i=l-1,j=r+1; //执行逻辑是先移动后判断 所以将ij向后移一位
          while(i<j){
              do i++ ; while(p[i]<x);  
              do j-- ; while(p[j]>x);
              if(i<j) swap(p[i],p[j]);
          }
          quick_sort(p,l,j);  //j也可以换成i-1
          quick_sort(p,j+1,r);  //j也可以换成i
          
          //不可以换成quick_sort(p,l,j-1)
          //j的位置可以保证其右侧的所有元素大于x
          //且 p[j]<=x的 所以不能将j作为右边界传入(不满足分治的要求)
      }
      int main(){
          scanf("%d", &n);  //用scanf不用cin 是因为scanf更快
          for(int i=0;i<n;i++){
              scanf("%d", &p[i]);
          }
          quick_sort(p,0,n-1);
          for(int i=0;i<n;i++){
              printf("%d", p[i]);
          }
          return 0;
      }