堆排序:思想:升序排列数组,把数组的元素拿来建大堆,然后把第一个元素和最后一个元素交换,那么交换之后最后一个元素就是最大值,然后在第一个元素的位置进行向下调整。
(注意:使用向下调整法建堆,这样能够给自己省不少麻烦,因为每次交换第一个元素和最后一个元素以后都要进行向下调整。)
代码:
public void HeapSort(int[] arr){
createHeap(arr);
for(int i=arr.length-1;i>0;i--){
int tmp=arr[i];
arr[i]=arr[0];
arr[0]=tmp;
shiftDown(arr,0,i);
}
}
public void createHeap(int[] arr){
for(int i=(arr.length-1-1)/2;i>=0;i--){
shiftDown(arr,i,arr.length);
}
}
public void shiftDown(int[] arr, int index,int size){
int parent = index;
int child = parent*2+1;
while(child<size){
if(child+1 <size && arr[child+1] >arr[child]){
child++;
}
if(arr[child]>arr[parent]){
int tmp=arr[child];
arr[child] =arr[parent];
arr[parent]=tmp;
}
parent=child;
child =parent*2+1;
}