1.堆排序的基本特性
1)稳定性:不稳定
2)平均时间复杂度:O(nlogn)
3)最小时间复杂度:O(nlogn)
4)最大时间复杂度:O(nlogn)
6)空间复杂度:O(1)
2.算法描述:
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序
基本思想:
将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了
3.算法实现:
public static String aaaaaa() {
long time1=System.nanoTime();
int[] list = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
for (int i = list.length / 2; i >= 0; i--) {
disassembly(list, i, list.length);
}
for (int i = list.length - 1; i > 0; i--) {
// 最后一个元素和第一元素进行交换
int temp = list[i];
list[i] = list[0];
list[0] = temp;
// 筛选 R[0] 结点,得到i-1个结点的堆
disassembly(list, 0, i);
}
System.out.println(System.nanoTime() - time1);
for (int i = 0; i < list.length; i++) {
System.out.print(list[i]+" ");
}
System.out.println();
return "1";
}
public static void disassembly(int[] list,int parent,int length){
int temp = list[parent]; // temp保存当前父节点
int child = 2 * parent + 1;
while (child < length) {
// 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
if (child + 1 < length && list[child] < list[child + 1]) {
child++;
}
// 如果父结点的值已经大于孩子结点的值,则直接结束
if (temp >= list[child]){
break;
}
// 把孩子结点的值赋给父结点
list[parent] = list[child];
// 选取孩子结点的左孩子结点,继续向下筛选
parent = child;
child = 2 * child + 1;
}
list[parent] = temp;
}
4.算法结果:
15212
2 3 4 5 15 19 26 27 36 38 44 46 47 48 50
5.其他:
堆
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]