zoukankan      html  css  js  c++  java
  • 回忆Partition算法及利用Partition进行快排

     一.Partiton算法

    Partiton算法的主要内容就是随机选出一个数,将这个数作为中间数,将大于它的排在它右边,小于的排在左边(无序的)。

      

     1 int partition (int arr[],int start,int end)  //传入一个数组和要进行partition的范围
     2 {
     3     
     4     int pivot = arr[start]; // 将第一个数做为中间数
     5     
     6     while( start < end ){
     7         
     8         while (start<end&&arr[end]>=pivot)  //从右边开始寻找,找到第一个小于中间数的数
     9         end--;
    10         arr[start]=arr[end];//找到后往最左边的位置放
    11         while (start<end&&arr[start]<=pivot) //同理,从最左边开始寻找,找到第一个大于中间数的数,往右边放
    12         start++;
    13         arr[end]=arr[start];//因为end的位置是之前第n个比中间数小的数,并且已经放在了靠左的位置,所以此时可以将比中间数大的数往end填
    14     }
    15     arr[start]=pivot;
    16     return start; //返回中间值的下标
    17 }

    二.利用Partition进行快排

    基本原理就是把某个范围一直缩小并且一直Partition.

    为了直观直接拿出一个数组进行排序。(可直接运行观察结果)

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int num[9]={1,4,2,6,3,5,3,3,8};
     6 
     7 int partition (int arr[],int start,int end)  //[start,end]
     8 {
     9     
    10     int pivot = arr[start];
    11     
    12     while( start < end ){
    13         
    14         while (start<end&&arr[end]>=pivot)
    15         end--;
    16         arr[start]=arr[end];
    17         while (start<end&&arr[start]<=pivot)
    18         start++;
    19         arr[end]=arr[start];
    20     }
    21     arr[start]=pivot;
    22     return start;
    23 }
    24 
    25 void sort(int arr[],int l,int r){   //将[l,r]范围内进行排序
    26     int mid = partition(num,l,r);   //在该范围进行一次partition,得到中间值的下标mid,可知此时mid对应的数以左的数比它小,以右的数比它大
    27     if(mid>l)sort(arr,l,mid-1);    //[l---mid--------------------r] 当mid大于范围的最小下标时,将[l,mid-1]范围内进行一次partition
    28     if(mid<r)sort(arr,mid+1,r);    //同理,当mid小于范围的最大下标时,将[mid+1,r]范围内进行一次partition
    29 }  //分到最后每个数的左边的数都比它本身小,右边的数都比它本身的大,也就完成了从小到大的排序。
    30 
    31 int main ( int argc, const char * argv[])
    32 {
    33     sort(num,0,8);
    34     for(int i=0;i<9;i++)
    35     cout<<num[i]<<" ";
    36     return 0;
    37 }

    为了防止忘记写下这篇博客,毕竟partition算法是很常用的一种算法,并且不止一种方法,目前就只记这种比较好理解的了。

  • 相关阅读:
    Netty之Channel*
    Netty之ByteBuf
    Spark On Yarn的各种Bug
    外网无法访问hdfs文件系统
    报错:Unsupported field: HourOfDay
    启动spark-shell --master yarn的bug
    KMP算法思路
    单例模式的正确实现
    redis 持久化
    记一次MacOs降级过程
  • 原文地址:https://www.cnblogs.com/xiangqi/p/10485379.html
Copyright © 2011-2022 走看看