使用Java编写堆排序算法的函数实现。
发布时间:2023-06-17 22:15:08
堆排序是一种高效的排序算法,其采用堆这种数据结构来实现排序。堆是一种特殊的树形数据结构,它满足两个条件:1.根结点的键值是所有结点中最小(或最大)的;2.每个子树的根结点的键值都小于(或大于)其子结点的键值。Java中可以使用数组来表示堆,其中下标从0开始,左孩子的下标为2*i+1,右孩子的下标为2*i+2,父节点的下标为(i-1)/2。
堆排序算法的基本思路是将待排序的序列构造成一个大根堆或小根堆,然后将堆顶元素与最后一个元素交换,再将前n-1个元素重新调整为堆,直到整个序列有序为止。
以下是Java编写堆排序算法的函数实现:
public class HeapSort {
public static void heapSort(int[] array) {
//构造初始堆,从最后一个非叶子结点开始调整
for(int i = array.length / 2 - 1; i >= 0; i--) {
adjustHeap(array, i, array.length);
}
//将堆顶元素与最后一个元素交换,然后重新调整堆
for(int i = array.length - 1; i > 0; i--) {
swap(array, 0, i);
adjustHeap(array, 0, i);
}
}
//调整堆,从第i个结点开始调整,n为数组长度
public static void adjustHeap(int[] array, int i, int n) {
int temp = array[i]; //先取出当前元素i
for(int j = 2*i+1; j < n; j = 2*j+1) { //从i结点的左子结点开始,也就是2i+1处开始
if(j+1 < n && array[j] < array[j+1]) { //如果左子结点小于右子结点,j指向右子结点
j++;
}
if(array[j] > temp) { //如果子节点大于父节点,将子节点的值赋给父节点(不用进行交换)
array[i] = array[j];
i = j;
} else {
break;
}
}
array[i] = temp; //将temp值放到最终的位置
}
//交换元素位置
public static void swap(int[] array, int a, int b) {
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
public static void main(String[] args) {
int[] array = {3, 5, 1, 6, 4, 7, 2, 8, 9};
heapSort(array);
System.out.println(Arrays.toString(array));
}
}
在该代码中,heapSort函数首先构造初始堆,然后将堆顶元素(最大值)与最后一个元素交换,并重新调整堆,这样每次交换后的新堆的长度就减少了1,直到整个序列有序为止。在adjustHeap函数中,我们采用了自下而上的方式进行调整,即从父节点开始,先找到其最大的子节点,与该父节点交换位置,然后再以交换后的子节点为父节点,继续向下调整。这种方式比自上而下的方式更高效,因为可以少一些swap操作。
