2.15日总结

今天主要看了数据结构,学习了堆排序,晚上看了esayx咋贴图,但是遇到了一点小问题

堆排序:

堆排序是一种基于堆数据结构的排序算法,它利用了堆的性质来高效地对数据进行排序。堆排序可以分为两种:最大堆排序和最小堆排序。通常我们讨论的是最大堆排序,即通过构建最大堆来实现升序排序。

1. 堆的定义

堆是一种特殊的完全二叉树,满足以下性质:

  • 最大堆:每个节点的值都大于或等于其子节点的值。

  • 最小堆:每个节点的值都小于或等于其子节点的值。

在堆排序中,我们通常使用最大堆来实现升序排序。

2. 堆排序的基本思想

堆排序的过程可以分为两个阶段:

  1. 构建最大堆:将无序的数组构建成一个最大堆。

  2. 排序:通过不断移除堆顶元素(最大值),并重新调整堆的结构,最终得到有序数组。

3. 堆排序的步骤

(1)构建最大堆
  • 从最后一个非叶子节点开始(数组索引为n/2 - 1,其中n是数组长度),向上调整堆,使得每个子树都满足最大堆的性质。

  • 调整堆的过程称为“堆化”(Heapify)。

(2)排序
  • 将堆顶元素(最大值)与堆的最后一个元素交换。

  • 堆的大小减1,重新调整堆。

  • 重复上述过程,直到堆的大小为1,此时数组已经有序。

  • #include 
    
    // 堆化函数,确保以索引i为根节点的子树满足最大堆的性质
    void heapify(int arr[], int n, int i) {
        int largest = i;  // 假设当前节点是最大值
        int left = 2 * i + 1;  // 左子节点
        int right = 2 * i + 2;  // 右子节点
    
        // 如果左子节点存在且大于当前最大值
        if (left < n && arr[left] > arr[largest]) {
            largest = left;
        }
    
        // 如果右子节点存在且大于当前最大值
        if (right < n && arr[right] > arr[largest]) {
            largest = right;
        }
    
        // 如果最大值不是当前节点,交换并递归堆化
        if (largest != i) {
            int temp = arr[i];
            arr[i] = arr[largest];
            arr[largest] = temp;
    
            heapify(arr, n, largest);  // 递归堆化
        }
    }
    
    // 堆排序函数
    void heapSort(int arr[], int n) {
        // 构建最大堆
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
        }
    
        // 逐个移除堆顶元素并重新堆化
        for (int i = n - 1; i > 0; i--) {
            // 将堆顶元素移到数组末尾
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
    
            // 重新堆化剩余部分
            heapify(arr, i, 0);
        }
    }
    
    
    void printArray(int arr[], int n) {
        for (int i = 0; i < n; i++) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
    
    
    int main() {
        int arr[] = {12, 11, 13, 5, 6, 7};
        int n = sizeof(arr) / sizeof(arr[0]);
    
        printf("原始数组: ");
        printArray(arr, n);
    
        heapSort(arr, n);
    
        printf("排序后的数组: ");
        printArray(arr, n);
    
        return 0;
    }

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