您的位置:首页 > 理论基础 > 数据结构算法

[数据结构与算法]——堆排序及按顺序排序

2019-04-30 10:27 375 查看

堆排序:
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。
点击这里查看详情
知识点:封装函数;堆的排序;
注意事项: int start = (arr.length-x)/2; x=1,2结果一样,最终取得都是倒数第二层的同一个节点;其他见代码注释部分;
写作纯属个人兴趣,如有错误请批评指正!

package Java01;

import java.util.Arrays;

public class HeapSort {
//主函数入口
public static void main(String[] args){

int[] arr = new int[] {10,78,9,68,0,17,8,48,2,33};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
//多次调用maxHeap,取出第一个值,也就是最大值,放置最后
public static void heapSort(int[] arr){
//定义开始位置,最后一个非叶子节点
int start = (arr.length-1)/2;
//调整为大顶锥
for(int i=start;i>=0;i--){
maxHeap(arr, arr.length, i );

}

for(int i = arr.length-1;i>0;i--){
int temp = arr[0];
arr[0]=arr[i];
arr[i]=temp;
maxHeap(arr,i,0);
}

}
// 参数主要有 数组,数组长度,索引
public static void maxHeap(int[] arr,int size,int index){
//左子节点
int leftNode = 2*index + 1;
//右子节点
int rightNode = 2*index + 2;
//暂且默认该节点为最大值,与自己的左右节点进行比较
int max = index;
if(size>leftNode&&arr[leftNode]>arr[max]){
max = leftNode;
}
if(size>rightNode&&arr[rightNode]>arr[max]){
max = rightNode;
}
//此处若发生交换,必定破坏了原有堆的结构,需要调整
if(max!=index) {
int temp=arr[index];
arr[index]=arr[max];
arr[max]=temp;
//调整,此时的max指向左节点或者右节点
maxHeap(arr,size,max);

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: