目录
说明
为了自己学习方便,我这里总结了四大排序算法涵盖了七种排序算法
分类 | 算法名称 | 时间复杂度 空间复杂度 | 稳定性 |
插入排序 | 直接插入排序 希尔排序 | O(n^2) O(1) O(n^2/3) O(1) | 稳定 不稳定 |
选择排序 | 选择排序 堆排序 | O(n^2) O(1) O(nlogn) O(1) | 不稳定 不稳定 |
交换排序 | 冒泡排序 快速排序 | O(n^2) O(1) 全部有序最坏O(n^2) O(1) | 稳定 不稳定 |
归并排序 | 归并排序 | O(nlogn) O(n) | 稳定 |
选择排序
选择排序就是遍历一遍数组,找到最大/最小的元素放在第一个位置,以此类推
public static void changeSort(int[] arr){
if(arr.length==0 || arr.length==1){
return;
}
for(int i=0;i<arr.length;i++){
int j=i;
int min=j;
//找到最小的元素
while (j<arr.length){
min = arr[min] > arr[j] ? j : min;
j++;
}
//交换i位置的元素,与min位置的元素
swap(i,min,arr);
}
}
堆排序
堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。
我们使用PriorityQueue来建立一个堆时,默认建立的小堆,如果要建大堆,需要使用比较器
//升序 不用比较器
PriorityQueue<Integer> priorityQueue=new PriorityQueue<>();
//降序 使用比较器
PriorityQueue<Integer> p=new PriorityQueue<>((o1,o2)->o2-o1);
堆是一颗完全二叉树,大根堆的父节点大于左右两个子节点,小根堆的父节点小于左右两个子节点 大根堆:arr[i]>=arr[2i+1]&&arr[i]>=arr[2i+2] 小根堆:arr[i]<=arr[2i+1]&&arr[i]<=arr[2i+2]