• 排序3题


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

    步骤

    通过堆排序来获取第k大的元素。
    1. 从第一个非叶子节点开始向上初始化堆,对于当前堆顶元素向下调整堆。
    2. 删除k-1个元素后,堆顶元素是第k个最大。

    Go代码

    package sort
    
    func findKthLargest(nums []int, k int) int {
    	initHeap(nums)
    	for i := 0; i < k - 1; i++ {
    		nums[0], nums[len(nums) - 1] = nums[len(nums) - 1], nums[0]
    		nums = nums[0:len(nums) - 1]
    		adjustDown(nums, 0)
    	}
    	return nums[0]
    }
    
    func initHeap(nums []int) {
    	for i := len(nums) / 2; i >= 0; i-- {
    		adjustDown(nums, i)
    	}
    }
    
    func adjustDown(nums []int, index int) {
    	for {
    		j := index * 2 + 1
    		if j >= len(nums) || j < 0 {
    			break
    		}
    
    		maxIndex := j
    		if j + 1 < len(nums) && nums[j + 1] > nums[j] {
    			maxIndex = j + 1
    		}
    
    		if nums[maxIndex] <= nums[index] {
    			break
    		}
    
    		nums[index], nums[maxIndex] = nums[maxIndex], nums[index]
    		index = maxIndex
    	}
    }

    912. 排序数组

    步骤

    通过递归来实现指定范围的快速排序。
    1. 首元素是基准,从右向左寻找第一个比基准小的数放到左边,从左向右寻找第一个比基准大的数放到右边,最终的p位置存放基准。
    2. 递归排序基准左边的子序列,递归排序基准右边的子序列,直到子序列长度是1。

    GO代码

    package sort
    
    func sortArray(nums []int) []int {
    	quickSort(nums, 0, len(nums) - 1)
    	return nums
    }
    
    func quickSort(nums []int, left, right int) {
    	if left >= right {
    		return
    	}
    
    	pivot := nums[left]
    	p := left
    	i := left
    	j := right
    	for i <= j {
    		for j >= p && nums[j] >= pivot {
    			j--
    		}
    		if j >= p {
    			nums[p] = nums[j]
    			p = j
    		}
    
    		for i <= p && nums[i] <= pivot {
    			i++
    		}
    		if i <= p {
    			nums[p] = nums[i]
    			p = i
    		}
    	}
    
    	nums[p] = pivot
    	quickSort(nums, left, p - 1)
    	quickSort(nums, p + 1, right)
    }

    75. 颜色分类

    步骤

    快速排序的三向切分排序变种
    low表示小于基准的右边界,high表示大于基准的左边界。
    小于基准的数字放左边,大于基准的数字放右边。

    GO代码

    func sortColors(nums []int)  {
        pivot := 1
        i := 0
        low := 0
        high := len(nums) - 1
        for i <= high {
            if nums[i] <= pivot {
                if nums[i] < pivot {
                    nums[i], nums[low] = nums[low], nums[i]
                    low++
                }
                i++
            } else {
                nums[i], nums[high] = nums[high], nums[i]
                high--
            }
        }
    }
  • 相关阅读:
    [Python]解决ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out
    Objective C XPC 初步学习<一>
    Vue的渣渣成长之路 第一章 登陆界面(vue+element+axios)以下文章感谢璋,威的同事给了我很大的帮助
    vue详情 恢复 删除
    vue添加
    vue显示详情加入回收站
    linq修改单条数据
    linq详情
    linq显示
    8.11模拟总结
  • 原文地址:https://www.cnblogs.com/WJQ2017/p/15996391.html
Copyright © 2020-2023  润新知