堆排序
堆排序(Heapsort)指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。
小根堆 大根堆
过程图示
先将堆变成大根堆,将堆顶与最后一个根节点交换,再将堆变成大根堆,将堆顶与倒数第二个节点交换。依次类推。
变成大根堆
再将堆顶元素放到最后
去掉最后一位继续重复上述步骤
代码实现:
public static void adjust(int[] array,int start,int end){
int tmp = array[start];
//由父节点得到子节点,
for(int i = 2*start+1; i <= end;i = 2*i+1 ){
//寻找最大的子节点
if(i<end && array[i] < array[i+1]){
i++;
}
//比较父节点与子节点的大小
if(array[i] > tmp){
array[start] = array[i];
start = i;
}else if(array[i] < tmp){
break;
}
}
array[start] = tmp;
}
public static void heapSort(int[] array){
//从最后一个节点的父节点开始遍历,变成大根堆
for(int i = (array.length-1-1)/2; i > -1;i-- ){
adjust(array,i,array.length-1);
}
//将堆顶元素与较后的元素交换
for(int i = 0;i<array.length;i++){
int tmp = array[0];
array[0] = array[array.length-1-i];
array[array.length-1-i] = tmp;
//交换完成后,再将堆变成大根堆
adjust(array,0,array.length-1-1-i);
}
System.out.println(Arrays.toString(array));
}
特性总结
(1) 堆排序使用堆来选数,效率就高了很多。
(2) 时间复杂度:O(n*logn)
(3)空间复杂度:O(1)
(4)稳定性:不稳定