堆排序
- 1、把数组的每个数当作最后一个,按大根堆排序位置往前交换位置,然后此时的结构满足大根堆。
- 2、接着把大根堆堆顶和最后一个交换位置,交换完,对最后一个位置不作处理,它就是全场最大的。
- 3、但是此时第一个数是来自最后的位置,接着又需要继续往下排序交换,完成堆化操作。
- 4、如此往返,每次确定一个最大的放数组后面不动。
时间复杂度O(N*logN) 空间复杂度O(1)
public class HeapSort {
public static void main(String[] args) {
int[] arr = {1,5,6,3,4,7};
for (int i = 0; i < arr.length; i++) {
heapInsert(arr,i);
}
int heapSize=arr.length;
swap(arr,0,--heapSize);
while (heapSize>0){
heapify(arr,0,heapSize);
swap(arr,0,--heapSize);
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void heapInsert(int[] arr,int i){
while (arr[i]>arr[(i-1)/2]){
swap(arr,i,(i-1)/2);
i=(i-1)/2;
}
}
public static void heapify(int[] arr,int i,int heapSize){
int leftChild = 2*i+1;
while (leftChild<heapSize){
int largest= leftChild+1<heapSize && arr[leftChild+1]>arr[leftChild]
?leftChild+1:leftChild;
largest = arr[largest]>arr[i]?largest:i;
if (largest==i){
break;
}
swap(arr,largest,i);
i=largest;
leftChild = 2*i+1;
}
}
public static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j]=temp;
}
}
|