ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

quicksort 两种partition方法

2021-09-12 22:31:25  阅读:181  来源: 互联网

标签:arr 两种 int lo partition quicksort hi pivot


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;
    }

标签:arr,两种,int,lo,partition,quicksort,hi,pivot
来源: https://www.cnblogs.com/traver/p/15260388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有