欢迎访问宙启技术站
智能推送

实现基于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实现,我们可以看到,堆排序是一种高效且简单的排序算法,可以很好地解决大数据量的排序问题。