zoukankan      html  css  js  c++  java
  • 快速排序模板

    一、快速排序-----分治思想
    1.确定分界点q[l],q[l+r/2],q[r],随机
    2.调整区间以x为分界,让<=x在左边  >=x在右边
     解1:
        2.1  两个数组a[],b[]
        2.2  q[l-r]     q[i]<=x     x---->a[]
                           q[i]>=x     x---->b[]
        2.3  a[]放q[],b[]放q[]
    解2(双指针):
        如代码
     3.递归处理左右两段左右排序再拼一起
     
    二、模板
     1 void quick_sort(int q[], int l, int r)
     2 {
     3     if (l>=r) return;
     4     int i=l-1,j=r+1,x=q[l+r>>1];
     5     while(i<j)
     6     {
     7         do i ++; while(q[i]<x);
     8         do j --; while(q[j]>x);
     9         if(i<j) swap(q[i],q[j]);
    10     }
    11     quick_sort(q,l,j), quick_sort(q,j+1,r);
    12 }
    13 
    14 //递归是j的话不能取到q[r]
    15 void quick_sort(int q[],int l,int r){
    16     if(l>=r) return;
    17     int x=q[l],i=l-1,j=r+1;
    18     while(i<j){
    19         do i++;while(q[i]<x);
    20         do j--;while(q[j]>x);
    21         if(i<j) swap(q[i],q[j]);
    22     }
    23     quick_sort(q,l,j);
    24     quick_sort(q,j+1,r);
    25 }
    26 
    27
    28 //递归用i的话,边界不能取到q[l]
    29 void quick_sort(int q[],int l,int r){
    30     if(l>=r) return;
    31     int x=q[(l+r+1)/2],i=l-1,j=r+1;
    32     //int x=q[(l+r)/2],i=l-1,j=r+1;
    33     while(i<j){
    34         do i++;while(q[i]<x);
    35         do j--;while(q[j]>x);
    36         if(i<j) swap(q[i],q[j]);
    37     }
    38     quick_sort(q,l,i-1);
    39     quick_sort(q,i,r);
    40 }

    三、题目链接
    1.Acwing:   https://www.acwing.com/problem/content/787/

    2.luogu:   https://www.luogu.com.cn/problem/P1177

  • 相关阅读:
    堆排序
    2019晋城一中开放日
    严格次小生成树
    遥远的国度
    noip2018游记
    Luogu1736 创意吃鱼法
    P3958 奶酪
    Luogu3385 负环
    Luogu1040 加分二叉树
    Luogu1007 独木桥
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/13873940.html
Copyright © 2011-2022 走看看