排序算法之堆排序

堆排序的思路:将待排序的数组先初始化为一个大顶堆或者小顶堆,交换第一个元素与最后一个元素,除去最后一个元素,重新构建大顶堆,然后交换第一个元素和倒数第二个元素。。。。

package wd;

import java.util.Arrays;

public class sortdui {

    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 对第k个元素进行堆排序
     * @param arr
     * @param k
     * @param length需要排序的数组的长度,随着不断地将第一个元素移到数组后面,这个长度会逐渐变小
     */
    public static void headSortNumber(int[] arr, int k, int length) {
        int i = (length + 1) / 2 - 1;
        while (k <= i) {
            int t = k * 2 + 1;
            if (t + 1 <= length && arr[t] < arr[t + 1]) {//如果左子结点小于右子结点,k指向右子结点
                t += 1;
            }

            if (arr[k] > arr[t])//如果子节点小于父节点,直接跳过
                break;

            swap(arr, k, t);
            k = t;
        }
    }

    public static void headSort(int[] arr) {
        //构建一个堆
        for (int j = arr.length / 2 - 1; j >= 0; j--) {
            headSortNumber(arr, j, arr.length - 1);
        }
        //进行堆排序
        for (int j = arr.length - 1; j > 0; j--) {
            swap(arr, j, 0);
            headSortNumber(arr, 0, j - 1);
        }
    }

    public static void main(String[] args) {
        int[] arr = new int[] { 2,0,1,2,8 };
        System.out.println(Arrays.toString(arr));
        System.out.println("************************************");
        headSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

 

你可能感兴趣的:(算法)