【LeetCode】经典排序算法变形

这里写目录标题

  • 75. 颜色分类
    • 题目描述
    • 方法1 统计每个元素个数
    • 方法2 三路快排
  • 88. 合并两个有序数组
    • 题目描述
    • 方法 从尾到头快速排序
    • 方法2 优化剩余数组的归并方法
  • 215. 数组中的第K个最大元素
    • 题目描述
      • 方法1 快速排序
      • 方法2 堆排序排序
      • 方法3 排序后选择元素

75. 颜色分类

题目描述

【LeetCode】经典排序算法变形_第1张图片

方法1 统计每个元素个数

	void sortColors(vector<int>& nums) {
		int count[3] = { 0 };//[0..low)为0
		for (int i = 0;i < nums.size();i++)
		{
			count[nums[i]]++;
		}
		int index = 0;
        for(int j=0;j<3;j++)
        {
		    for (int i = 0;i < count[j];i++)
		    {
			    nums[index++] = j;
		    }
        }
	}

方法2 三路快排

	void sortColors(vector<int>& nums) {
		int low = 0;//[0..low)为0
		int high = nums.size() - 1;//[high..size-1]为2
		for (int i = 0;i <high;)
		{
			if (nums[i] == 1)
			{
				i++;
			}
			else if (nums[i] == 0)
			{
				nums[i++] = 1;
				nums[low++] = 0;
			}
			else
			{
				nums[i] = nums[--high];
				nums[high] = 2;
			}

		}
	}

88. 合并两个有序数组

题目描述

【LeetCode】经典排序算法变形_第2张图片

方法 从尾到头快速排序

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int len = m + n-1;
        int i = m - 1;//从尾到头
        int j = n - 1;
        for (;len >= 0;len--)
        {
            if (i == -1)//其中一个数组用完了
            {
                nums1[len] = nums2[j--];
                continue;
            }
            else if (j == -1)
            {
                nums1[len] = nums1[i--];
                continue;
            }
            if (nums2[j] >= nums1[i])
            {
                nums1[len] = nums2[j--];
                //j--;
            }
            else if (nums2[j] < nums1[i])
            {
                nums1[len] = nums1[i--];
                //i--;
            }
        }
    }

方法2 优化剩余数组的归并方法

    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int len = m + n - 1;
        int i = m - 1;
        int j = n - 1;
        while (j >= 0&&i>=0)
        {
            if (nums2[j] >= nums1[i])
            {
                nums1[len--] = nums2[j--];
            }
            else if (nums2[j] < nums1[i])
            {
                nums1[len--] = nums1[i--];
            }
        }
        while (j >= 0)//如果是num2先归并 就不用管了
        {
            nums1[len--] = nums2[j--];
        }
    }

215. 数组中的第K个最大元素

题目描述

【LeetCode】经典排序算法变形_第3张图片

方法1 快速排序

   void myswap(int& a, int& b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    }
    int partition(vector<int>& nums, int l, int r)
    {
        int p = nums[l];//[l..r]的范围中寻找
       // int low = l+1;//[l+1..low)都是大于初始的元素
        int high = r+1;//[high..r]都是小于的元素
        int i = l+1;
        while (i < high)
        {
            if (nums[i] >= p)
            {
                i++;
            }
            else
            {
                myswap(nums[i], nums[--high]);
            }
        }
        myswap(nums[l], nums[--i]);
        return i;
    }
    int findKthLargest(vector<int>& nums, int k) {
        int l = 0;
        int r = nums.size() - 1;
        while (l <= r)
        {
            
            int res = partition(nums, l, r);
            if (res == k-1)
            {
                return nums[res];
            }
            else if (res > k-1)
            {
                r = res-1;
            }
            else
            {
                l = res + 1;
            }
        }
        
    }

方法2 堆排序排序

方法3 排序后选择元素

你可能感兴趣的:(做题)