堆排序
1,先让整个数组都变成大根堆结构,建立堆的过程:
1)从上到下的方法,时间复杂度为O(N*logN)
for(int i = 0; i< arr.length; i++) {
heapinsert(arr,i);
}
2)从下到上的方法,时间复杂度为O(N)
for( int i = arr.length - 1 ; i>=0;i--) {
heapfy(arr,i,arr.length);
}
2,把堆的最大值和堆末尾的值交换,然后减少堆的大小之后,再去调 整堆,一直周而复始,时间复杂度为O(N*logN)
int heapsize = arr.length;
swap(arr,0,--heapsize);
while(heapsize>0) {
heapfy(arr,0,heapsize);
swap(arr,0,--heapsize);
}
我的代码:
public class heapsort {
public static void heapSort(int []arr) {
if(arr == null &&arr.length < 2) {
return ;
}
for( int i = arr.length - 1 ; i>=0;i--) {
heapfy(arr,i,arr.length);
}
int heapsize = arr.length;
swap(arr,0,--heapsize);
while(heapsize>0) {
heapfy(arr,0,heapsize);
swap(arr,0,--heapsize);
}
}
public static void heapinsert(int [] arr,int index) {
while(arr[index]>arr[(index-1)/2]) {
swap(arr,index,(index-1)/2);
index=(index-1)/2;
}
}
public static void heapfy(int [] arr,int index,int heapsize) {
int left = index*2+1;
while(left<heapsize) {
int largest = left+1<heapsize && arr[left]<arr[left=1] ? left+1 : left;
largest = arr[index]<arr[largest] ? largest:index;
if(largest==index) {
break;
}
swap(arr,index,largest);
index = largest;
left = index * 2 + 1;
}