quicksort 两种partition方法

quicksort

随机选取一个轴点,将数组分为比pivot小和比pivot大的部分,对两部分递归进行排序
快速排序算法是不稳定的排序算法
比如 5,5,3 在第一种填坑法中,两个5将会调换顺序

vector<int>& quicksort(vector<int>& arr, int lo, int hi)//左闭右开区间
    {
        if(lo+1>=hi)
            return arr;
        int mid=partition(arr, lo, hi);
        quicksort(arr,lo,mid);
        quicksort(arr,mid+1,hi);
        return arr;
    }

填坑法

左右方向扫描,依次填坑

int partition(vector<int>& arr, int lo, int hi)
    {
        int randIdx=rand()%(hi-lo)+lo;
        swap(arr[randIdx],arr[lo]);
        int pivot=arr[lo];
        int left=lo,right=hi-1;
        while(left<right)
        {
            while(left<right&&arr[right]>=pivot)
                --right;
            if(left<right)
                arr[left]=arr[right];
            while(left<right&&arr[left]<pivot)
                ++left;
            if(left<right)
                arr[right]=arr[left];
        }
        arr[left]=pivot;
        return left;
    }

从左到右扫描法

将比pivot小的元素依次放入数组的左边

int partition(vector<int>& arr, int lo, int hi)
    {
        int randIdx=rand()%(hi-lo)+lo;
        swap(arr[randIdx],arr[hi-1]);
        int pivot=arr[hi-1];
        int smallPos=lo;
        int i=lo;
        for(;i<hi-1;++i)
        {
            if(arr[i]<pivot)
                swap(arr[i],arr[smallPos++]);
        }
        swap(arr[smallPos],arr[hi-1]);
        return smallPos;
    }
上一篇:《深入理解Kafka:核心设计与实践原理》读书笔记


下一篇:装win10系统时遇到的一些问题