目录
堆排序
1.原理
基本原理也是选择排序,只是不再使用遍历的方式查找无序区间的最大数,而是通过堆来选择无序区间的最大数
升序:大顶堆;降序:小顶堆
堆排序的基本思路:
a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。
2.实现
//堆排序
public void heapSort(int[] array){
createHeap(array);
for (int i = 0;i < array.length-1;i++){
swap(array,0,array.length-1-i);
SiftDown(array,array.length-1-i,0);
}
}
private void createHeap(int[] array){
for (int i = (array.length-1)/2;i >= 0;i++){
SiftDown(array,array.length,0);
}
}
private void SiftDown(int[] array,int size,int index){
int e = array[index];
while (2*index + 1 < size){
int j = 2*index + 1;
//该节点有右孩子,并且右孩子大于左孩子的值
if (j+1 < size && array[j+1] > array[j]){
j++;
}
//该节点大于孩子值
if(e > array[j]){
break;
}
swap(array,index,j);//保持该点为其左右子树的最大值
index = j;
}
}
3.性能分析
1.时间复杂度
O(nlogn)
2.空间复杂度
O(1)
3.稳定性?
不稳定