堆排序的算法描述如下:

  1. 将待排序数组构建成一个大根堆或小根堆;
  2. 将堆顶元素与堆底元素交换位置,然后将堆的大小减1;
  3. 对堆顶元素进行一次下沉操作,使其重新成为一个合法的堆;
  4. 重复步骤2和步骤3,直到堆的大小为1。

大根堆或小根堆的构建和下沉操作的实现可以使用数组或二叉堆来实现。具体实现可以参考伪代码:

// 构建大根堆
void buildMaxHeap(int[] nums, int len) {
    for (int i = len / 2; i >= 0; i--) {
        maxHeapify(nums, i, len);
    }
}

// 下沉操作
void maxHeapify(int[] nums, int i, int len) {
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    int largest = i;
    if (left < len && nums[left] > nums[largest]) {
        largest = left;
    }
    if (right < len && nums[right] > nums[largest]) {
        largest = right;
    }
    if (largest != i) {
        swap(nums, i, largest);
        maxHeapify(nums, largest, len);
    }
}

// 交换元素
void swap(int[] nums, int i, int j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}

// 堆排序
void heapSort(int[] nums) {
    int len = nums.length;
    buildMaxHeap(nums, len);
    for (int i = len - 1; i > 0; i--) {
        swap(nums, 0, i);
        len--;
        maxHeapify(nums, 0, len);
    }
}
堆排序算法详解:原理、代码实现及优化

原文地址: https://www.cveoy.top/t/topic/lSlu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录