• 二分partition算法应用


    一个二分partition算法,将整个数组分解为小于某个数和大于某个数的两个部分,然后递归进行排序算法。

    法一:

    int partition(vector<int>&arr, int begin, int end){
        int pivot = arr[begin];
        // Last position where puts the no_larger element.
        int pos = begin;
        for(int i=begin+1; i!=end; i++){
            if(arr[i] <= pivot){
                pos++;
                if(i!=pos){
                    swap(arr[pos], arr[i]);
                }
            }
        }
        swap(arr[begin], arr[pos]);
        return pos;
    }

    法二:

    int partition(vector<int> &nums, int begin, int end)
    {
        int pivot = nums[begin];
        while(begin < end)
        {
            while(begin < end && nums[--end] >= pivot);
            nums[begin] = nums[end];
            while(begin < end && nums[++begin] <= pivot);
            nums[end] = nums[begin];
        }
        nums[begin] = pivot;
        return begin;
    }

    经典的快速排序算法,直接上代码:

    void quickSort(vector<int> &nums, int begin, int end)
    {
        if(end - begin <= 1)
            return;
        int mid = partition(nums, begin, end);
    
        quickSort(nums, begin, mid);
        quickSort(nums, mid, end);
    }

    数组第K大数值查询

    class Solution
    {
        public:
            int findKthLargest(vector<int> &nums, int k)
            {
                int len = nums.size();
                int res = 0;
                int left = 0;
                int right = len;
                while(left < right)
                {
                    int pos = partition(nums, left, right);
                    if(pos == len-k)
                    {
                        res = nums[pos];
                        break;
                    }
                    else if(pos < len-k)
                        left = pos+1;
                    else
                        right = pos;
                }
                return res;
            }
            int partition(vector<int> &nums, int begin, int end)
            {
                int pivot = nums[begin];
                while(begin < end)
                {
                    while(begin < end && nums[--end] >= pivot);
                    nums[begin] = nums[end];
                    while(begin < end && nums[++begin] <= pivot);
                    nums[end] = nums[begin];
                }
                nums[begin] = pivot;
                return begin;
            }
    };
  • 相关阅读:
    ubuntu安装sublime无工具栏解决办法
    ubuntu安装eclipse无工具栏解决办法
    数据库设计
    cglib代理
    多线程简单实例(3)线程池
    多线程简单实例(2)生产者和消费者
    STL之迭代器(iterator)
    STL之vector
    “由于这台计算机没有终端服务器客户端访问许可证”解决方案
    STL之容器(containers) 简介
  • 原文地址:https://www.cnblogs.com/yfz1552800131/p/8513840.html
Copyright © 2020-2023  润新知