实现基于Java的堆排序算法
发布时间:2023-06-22 05:07:38
堆排序是一种常用排序算法,其时间复杂度为O(nlogn),它将数据看作是一颗完全二叉树,然后将这个二叉树看作是一个堆,通过调整堆中元素的位置,使得堆仍然满足堆的性质,最后得到有序序列。
堆排序分为两个过程, 个过程是建堆,第二个过程是堆排。
(1)建堆
根据堆的定义,堆的 个元素是最大元素,所以可以先将整个序列建立成大顶堆(或者小顶堆),接着调整堆结构,将堆顶元素与末尾元素进行交换,使末尾元素最大,然后继续调整堆结构使其满足堆的定义,再交换堆顶元素与末尾元素…这样反复进行交换和调整,直到整个序列有序。
(2)堆排
堆排序的主要过程如下:
1. 先建堆
2. 交换堆顶元素和末尾元素,然后堆的长度减少1
3. 调整堆结构,保证堆仍然满足堆的定义
4. 重复步骤2、3,直到堆的长度为1
Java实现基于堆的排序算法
下面是一个基于Java的堆排序算法的实现,使用了递归的方式进行建堆和堆排:
public class HeapSort {
public static void sort(int[] arr){
int len=arr.length;
if(len<2) return;
//建堆
createHeap(arr, len-1);
//堆排序
for(int i=len-1;i>0;i--){
swap(arr, 0, i);
adjustHeap(arr, 0, i-1);
}
}
//建堆
public static void createHeap(int[] arr, int end){
int begin=(end-1)>>1;
for(int i=begin;i>=0;i--){
adjustHeap(arr, i, end);
}
}
//调整堆
public static void adjustHeap(int[] arr, int index, int end){
int left=index<<1|1,right=left+1;
int maxIndex=index;
if(left<=end && arr[left]>arr[maxIndex]){
maxIndex=left;
}
if(right<=end && arr[right]>arr[maxIndex]){
maxIndex=right;
}
if(maxIndex!=index){
swap(arr, maxIndex, index);
adjustHeap(arr, maxIndex, end);
}
}
//交换元素
public static void swap(int[] arr, int i, int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
上述代码实现了基于Java的堆排序算法,主要包括三个函数:
1. sort函数:该函数是对外部调用接口,用于进行堆排序操作。
2. createHeap函数:该函数用于建堆,首先计算出需要调用该函数多少次(即需要调整的元素的个数),然后从最后一个非叶子结点开始一个一个进行调整,调整完之后就建成一个大顶堆(或者小顶堆)。
3. adjustHeap函数:该函数用于调整堆,如果子节点中有一个比当前节点大(或者小),就将该子节点和当前节点进行交换,然后继续递归下去,直到满足堆的性质。
通过以上Java实现,我们可以看到,堆排序是一种高效且简单的排序算法,可以很好地解决大数据量的排序问题。
