第k大的元素

在数组中找到第k大的元素

 注意事项

你可以交换数组中的元素的位置

样例

给出数组 [9,3,2,4,8],第三大的元素是 4

给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推

堆排序:

建立大小为k的小顶堆,输出nums[0]

void makeHeap(vector<int> &nums,int k,int n)
     {
         int i = k;
         int j = 2 * i + 1;
         int temp = nums[i];
         while(j < n)
         {
             if(j < n - 1 && nums[j] > nums[j + 1])j++;

             if(temp < nums[j])break;
             else
             {
                 nums[i] = nums[j];
                 i = j;
                 j = 2 * j + 1;
             }
         }
         nums[i] = temp;
     }
     void initHeap(vector<int> &nums,int n)
     {
         for(int i = (n - 2) / 2;i >= 0;i--)
         {
             makeHeap(nums,i,n);
         }
     }
     
    int kthLargestElement(int k, vector<int> nums) {
        // write your code here
        int n = nums.size();
        if(k > n)return -1;
        initHeap(nums,k);
        for(int i = k;i < n;i++)
        {
            if(nums[i] > nums[0])
            {
                int tmp = nums[i];
                nums[i] = nums[0];
                nums[0] = tmp;
                makeHeap(nums,0,k);
            }
        }
        return nums[0];
    }

快排:

从大到小排列,输出nums[k - 1]

int parition(vector<int> &nums,int low,int high)
  {
    int i = low;
    int j = high;
    int temp = nums[i];
    while(i < j)
    {
        while(i < j && nums[j] <= temp)j--;
        if(i < j )
        {
           nums[i++] = nums[j];
        }
        while(i < j && nums[i] > temp)i++;
        if(i < j)
        {
            nums[j--] = nums[i];
        }
    }
    nums[i] = temp;
    return i;
  }
  int kthLargestElement(int k, vector<int> nums) {
        // write your code here
        int n = nums.size();
        if(k > n)return -1;
        int i = 0;
        int j = n -1;
        while(1)
        {
            int qqq = parition(nums,i,j);
            if(qqq == k - 1)return nums[k - 1];
            else if(qqq < k -1)
            {
                i = qqq + 1;

            }
            else j = qqq - 1;

        }
        return -1;
    }
原文地址:https://www.cnblogs.com/dynas/p/7011040.html