按排序方法分类
按存储介质分
按比较器个数可分为
按主要操作可分为
按辅助空间
按稳定性
使用顺序查找法查找插入位置
使用哨兵
过程
排序对不相邻的记录进行比较和移动:
class Solution {
public int[] sortArray(int[] nums){
shellSort(nums);
return nums;
}
public void shellSort(int[] nums){
for(int step = nums.length >> 1; step >= 1; step = step >> 1){
for(int start = step; start < nums.length; start++){
for(int j = start - step; j >= 0 && nums[j + step] < nums[j]; j-=step){
swap(nums, j, j + step);
}
}
}
}
public void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
——改进的交换排序
节省空间秘技:【左右横跳】 https://www.bilibili.com/video/BV1nJ411V7bd?p=164&vd_source=6c2daed6731190bb7d70296d6b9746bb
堆的定义
排序的调整
无序变有序的输出过程
- 输出根节点
- 将一个叶子节点放到根节点
- 不断比较其左右孩子值的大小,并与其中较小者交换,直到底下没有更大的节点
小根堆的建立
从 最底下的一个非叶子节点开始,找左右孩子最小的来替换本节点。向上逐个调整
堆排序算法
双指针法
按照逐个的关键字排序