赞
踩
堆排序是一种常见的排序算法。它的基本思想是:
将待排序序列构建成一个大顶堆。大顶堆的特点是根节点的值大于或等于其左右子节点的值。
交换根节点(即当前最大值)与末尾元素。
减小堆的规模,重新调整结构,使其满足堆定义,然后再次交换根节点与当前末尾元素。
反复执行步骤2和步骤3,直到整个序列有序。
具体实现步骤如下:
堆排序的时间复杂度为O(nlogn)。空间复杂度为O(1),因为它在原数组上进行排序,不需要额外的内存空间。
堆排序的优势是能够在一个数组上就地完成排序,不需要额外的空间。缺点是对于小规模的数据,不如简单的插入排序和冒泡排序快。
优点:
缺点:
堆排序的主要功能是对一个给定的数组进行升序或降序排序。具体来说,堆排序有以下几个主要功能:
heapify(arr, n, i)
函数用于构建大顶堆。它从最后一个非叶子节点开始,向上调整整个堆。
heapify(int arr[], int n, int i)
函数:
i
为根节点的子树,使其满足大顶堆的性质。largest
。- void heap_sort(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);
- }
- }
heap_sort(arr, n)
函数实现了堆排序的算法。它首先构建大顶堆,然后反复交换堆顶元素和末尾元素,并重新调整堆。
heap_sort(int arr[], int n)
函数:
heapify
函数,构建一个大顶堆。heapify
函数,以维护堆的性质。- 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);
- }
- }
main()
函数:
main
函数中,首先定义了一个待排序的数组 data
。heap_sort
函数对数组进行排序。- int main() {
- int data[] = {12, 11, 13, 5, 6, 7};
- int n = sizeof(data) / sizeof(data[0]);
- heap_sort(data, n);
- printf("Sorted array is \n");
- for (int i = 0; i < n; i++)
- printf("%d ", data[i]);
- printf("\n");
- return 0;
- }
- #include <stdio.h>
-
- 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 heap_sort(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);
- }
- }
-
- int main() {
- int data[] = {12, 11, 13, 5, 6, 7};
- int n = sizeof(data) / sizeof(data[0]);
-
- heap_sort(data, n);
-
- printf("Sorted array is \n");
- for (int i = 0; i < n; i++)
- printf("%d ", data[i]);
- printf("\n");
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。