LeetCode刷题-04-排序
2021-03-13 04:35
标签:ast run upload https array ons 交换 长度 vat 平均时间复杂度 O(n^2) ,空间复杂度 O(1),稳定 基本思想 演示(图片来自菜鸟教程) 代码 平均时间复杂度 O(n^2) ,空间复杂度 O(1),不稳定 基本思想 演示 代码 平均时间复杂度 O(n^2) ,空间复杂度 O(1),稳定 基本思想 演示(图片来自菜鸟教程) 代码 平均时间复杂度 O(n log(n)) ,空间复杂度 O(n),稳定 基本思想(分治) 演示(图片来自菜鸟教程) 代码 平均时间复杂度 O(n log(n)) ,空间复杂度 O(log n),不稳定 算法思想(分治) 演示(图片来自菜鸟教程) 具体操作 代码 平均时间复杂度 O(n+k) ,空间复杂度 O(k),稳定 什么是堆? 基本思想 演示 代码 平均时间复杂度 O(n+k) ,空间复杂度 O(k),稳定。其中,k是整数的范围 基本思想 演示 代码 注意:计数排序对于一定范围内的整数进行排序具有最高的效率,前提是整数的范围不要太大 平均时间复杂度 O(n) ,空间复杂度 O(n+k),稳定。其中k是桶的数量 基本思想 关键 演示 代码 思路 时间复杂度 O(n),空间复杂度 O(1) 代码 注意点 思路 代码 优化 代码 思路 代码 思路 代码 LeetCode刷题-04-排序 标签:ast run upload https array ons 交换 长度 vat 原文地址:https://www.cnblogs.com/primabrucexu/p/14061405.html第四讲 排序
4.1 巨经典的排序算法
1. 冒泡排序(很简单)
/**
* 冒泡排序
* @param array 待排序的数组
*/
public static void bubbleSort(int[] array) {
for(int i=0; ii; j--){
if(array[j]
2. 选择排序
i
小的元素,然后把它和第i
个元素交换位置/**
* 选择排序
* @param array 待排序的数组
*/
public static void selectSort(int[] array) {
for(int i=0;i
3. 插入排序
i
个数已经排好序了,那么第 i+1
个数只需要插入到前面已经排好序的数组中即可/**
* 插入排序
* @param array 待排序的数组
*/
public void insertSort(int[] array) {
for (int i = 0; i 0; j--) {
if (array[j]
4. 归并排序
/**
* 归并排序
* @param array 需要排序的数组
* @return 排好序的数组
*/
public int[] mergeSort(int[] array) {
// 创建额外的空间
int[] res = Arrays.copyOf(array, array.length);
if (res.length
5. 快速排序(很常用)
i=0,j=n-1,key=array[i]
j
向前移动,找到第一个比 key
小的元素,把这个元素放到 i
i
向后移动,找到第一个比 key
大的元素,将它放到 j
的位置i
的地方放上 key
[0,i-1]
中所有的元素都是比 i
小的,[j,n-1]
中的所有元素都是比 i
大 的,然后重复操作,直到 i==j
这样就满足了 array[0,i-1] 。然后
i
左右两边的区间重复操作。/**
* @param array 需要排序区间所在的数组
* @param left 区间的起始下标
* @param right 区间的结束下标
*/
public void quickSort(int[] array, int left, int right) {
if (left = key) {
j--;
}
if (i
6. 堆排序
i
的元素,他的左右孩子的下标是 2i+1
和 2i+2
/**
* 堆排序
* @param array 待排序的数组
*/
public void heapSort(int[] array) {
// len表示的是未进行排序的长度
int len = array.length;
for (int i = 0; i = 0; j--) {
int left = 2 * j + 1;
int right = left + 1;
if (array[left] > array[j]) {
swap(array, left, j);
}
if (right array[j]) {
swap(array, right, j);
}
}
len--;
// 将堆顶元素和放到正确的地方
swap(array, 0, array.length - 1 - i);
}
}
/**
* 交换数组中的两个元素
* @param array 数组
* @param i1 元素1
* @param i2 元素2
*/
private void swap(int[] array, int i1, int i2) {
int temp = array[i1];
array[i1] = array[i2];
array[i2] = temp;
}
7. 计数排序
/**
* 计数排序
* @param array 待排序的数组
*/
public void countingSort(int[] array) {
int min = array[0];
int max = array[0];
// 找最大值和最小值
for (int i : array) {
min = Math.min(i, min);
max = Math.max(i, max);
}
// 申请额外的空间,大小为最值之间的范围
int[] temp = new int[max - min + 1];
// 填充新数组
for (int i : array) {
temp[i - min]++;
}
// 遍历新数组,然后填充原数组
int index = 0;
for (int i = 0; i
8. 桶排序
4.2 快速选择
215. 数组中的第K个最大元素(Medium)
key
来说,在进行一次快速排序的过程中,是可以确定出这个 key
所在有序数组中的位置。K
即可。如果比 k
大,则在 key
的右边再做一次快速排序即可;反之,则在左边做一次快速排序public int findKthLargest(int[] nums, int k) {
int left = 0;
int right = nums.length - 1;
int target = nums.length - k;
while (left target) {
right = p - 1;
} else {
return nums[p];
}
}
return nums[left];
}
// 快速排序函数,返回key的下标
public int quickSort(int[] array, int left, int right) {
int i = left;
int j = right;
int key = array[left];
while (i = key) {
j--;
}
if (i
k=1
时,函数可能不会在循环体中返回结果。此时,退出循环后left=5
,所以要返回 nums[left]
4.3 桶排序
347. 前 K 个高频元素(Medium)
public int[] topKFrequent(int[] nums, int k) {
int[] res = new int[k];
// 用哈希表做桶排序,每个元素作为key,出现次数作为value
Map
// 再对频率进行一次桶排序,这样就可以得到前K个高频的元素
// 对于频率最高的元素,放在最前面
List
4.4 基础练习
451. 根据字符出现频率排序(Medium)
public String frequencySort(String s) {
Map
4.5 进阶练习
75. 颜色分类(Medium)
public void sortColors(int[] nums) {
int[] f = new int[3];
for (int num : nums) {
f[num]++;
}
int p = 0;
for (int i = 0; i
上一篇:Spring是什么?