面试问题浓缩总结 面试问题浓缩总结
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • 算法

  • 数据结构

  • 设计模式

  • CMU硕士经典100题

    • 贪心算法
    • 双指针法
    • 二分查找
    • 各种排序
      • 常用的排序算法
      • 快速选择
        • 数组中的第K个最大元素
      • 桶排序
        • 前k个高频元素
    • 各种搜索
    • 动态规划
    • 分治法解题
    • 数学问题
    • 位运算
    • 数据结构
    • 字符串
    • 链表
    • 树
    • 图
    • 更加复杂的数据结构
  • 剑指offer

  • 重点手撕代码

  • 程序员面试

  • CodeTop企业题库

  • 笔试题目

  • 算法和数据结构
  • CMU硕士经典100题
小游
2021-03-24

各种排序

# 常用的排序算法

以下是一些最基本的排序算法。虽然在 C++ 里可以通过 std::sort() 快速排序,而且刷题 时很少需要自己手写排序算法,但是熟习各种排序算法可以加深自己对算法的基本理解,以及解 出由这些排序算法引申出来的题目。

关于常用的排序算法可以移步到 排序算法 | 面试问题浓缩总结 (xiaoyou66.com) (opens new window)

# 快速选择

# 数组中的第K个最大元素

215. 数组中的第K个最大元素 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

image-20210315211114681

这个题目其实很简单,就是自己先对数组进行排序,然后找到k的最大的元素就可以了(第一次手写快排哈哈~,,居然让我蒙对了好多)

func findKthLargest(nums []int, k int) int {
	// 先对数组进行排序
	quickSort(nums,0,len(nums)-1)
	return nums[len(nums)-k]
}

// 快速排序找到中点
func finMid(arr []int,low int,high int) int  {
	// 我们就使用第一个作为临时点
	tmp:=arr[low]
	for low < high {
		// 错误一:这里必须要low<high
		for low < high && arr[high] >= tmp {
			high --
		}
		arr[low] = arr[high]
		for low < high && arr[low] <= tmp {
			low ++
		}
		arr[high] = arr[low]
	}
	arr[low] = tmp
	return low
}

// 快速排序
func quickSort(arr []int,low int,high int)  {
	//错误2 这里是要确保low<high
	if low < high {
		mid:=finMid(arr,low,high)
		quickSort(arr,low,mid-1)
		quickSort(arr,mid+1,high)
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 桶排序

# 前k个高频元素

image-20210315213526823

这个题目在简单看了一下别人的思路的情况下做出来了,不容易啊,一直错误。。这个题目难点在于我们如何找出频率前k高的元素,还要保证时间复杂度优于nlogn,而且最变态的就是不同数字的出现次数居然还能重复。。。

所以我们使用桶排序来解决,首先我们使用map统计每个数字出现的次数,同时我们获取出现次数最多是多少。然后我们就建立一个大小为出现次数最多的一个桶,然后我们遍历map把数据放到桶里面去,最后我们只需要遍历这个桶就行了

func topKFrequent(nums []int, k int) []int {
	// 首先我们使用count来统计出现的频次
	count:=make(map[int]int)
	// 先遍历一次获取出现频率最大的
	max:=0
	for _,v:=range nums{
		count[v] ++
		// 这里获取出现次数最大的值
		if count[v] > max {
			max = count[v]
		}
	}
	// 然后我们就可以按照出现的频率来创建一个桶
	bucket:=make([][]int,max+1)
	// 创建一个map来存储数据
	for i,v:=range count{
		bucket[v]=append(bucket[v], i)
	}
	// 下面我们就可以找出前n高的元素了
	var ans []int
	for i:=len(bucket)-1;i>=0;i-- {
		// 因为我们桶里面是可能出现不同数的情况所以我们需要遍历
		for _,v:=range bucket[i] {
			// 当我们找出这前n个时,我们就立即返回
			if len(ans) < k {
				ans = append(ans,v)
			} else {
				return ans
			}
		}
	}
	return ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

基础难度 451. Sort Characters By Frequency (Medium) 桶排序的变形题。 进阶难度 75. Sort Colors (Medium) 很经典的荷兰国旗问题,考察如何对三个重复且打乱的值进行排序。

编辑 (opens new window)
上次更新: 2021/03/25, 23:10:37
二分查找
各种搜索

← 二分查找 各种搜索→

Theme by Vdoing | Copyright © 2021-2021 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式