1.堆排序是nlogN级别的排序:
public static void heapSort(int[] arr){
//1.先将arr进行heapify调整为最大堆
//从最后一个非叶子结点开始进行shiftDown操作
for (int i = (arr.length -1 -1)>>1; i >= 0; i--) {
shiftDown(arr, i, arr.length);
}
//此时arr调整为最大堆
for (int i = arr.length -1; i >0 ; i--) {
//arr[0]就是堆顶元素,就是当前堆的最大值
swap(arr,0,i);
shiftDown(arr,0,i);
}
}
//元素下沉操作
private static void shiftDown(int[] arr, int i, int length) {
while(2* i +1 <length){
int j = (i<<1) +1;
if(j + 1<length && arr[j +1] >arr[j]){
j = j+1;
}
//j就是左右子树的最大值
if(arr[i] >arr[j]){
//下沉结束
break;
}else{
swap(arr,i,j);
i = j;
}
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {7,5,4,3,1,2,10,9,8};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
2.冒泡排序o(n^2)
public static void bubbleSort(int[] arr){
for (int i = 0; i <arr.length -1; i++) {
boolean isSwaped = false;
for (int j = 0; j <arr.length -1 -i; j++) {
if(arr[j] >arr[j +1]){
swap(arr,j,j+1);
isSwaped = true;
}
}
if(!isSwaped){
break;//已经彻底有序了
}
}
堆和优先级队列:
1.最大堆、最小堆实现
2.堆排序
3.TopK问题
17.14 -- 343--373