• C语言堆排序


     

    堆排序(Heapsort)是一种在时间复杂度上达到了最优的基于比较的排序算法。堆排序算法是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

    堆排序的基本思想是:

    1. 首先将待排序的序列构造成一个大顶堆(或小顶堆)。
    2. 此时,整个序列的最大值(或最小值)就是堆顶的根节点。
    3. 将其与末尾元素进行交换,此时末尾就为最大值(或最小值)。
    4. 然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值(或次大值)。
    5. 如此反复执行,便能得到一个有序序列了。

    堆排序的时间复杂度是O(n log n)。

    1. #include
    2. // 将以k为根的子树调整为最大堆
    3. void heapify(int arr[], int n, int k) {
    4. int largest = k; // 初始化根节点最大
    5. int left = 2 * k + 1; // 左子节点
    6. int right = 2 * k + 2; // 右子节点
    7. // 如果左子节点比根节点大,则更新最大节点
    8. if (left < n && arr[left] > arr[largest]) {
    9. largest = left;
    10. }
    11. // 如果右子节点比最大节点大,则更新最大节点
    12. if (right < n && arr[right] > arr[largest]) {
    13. largest = right;
    14. }
    15. // 如果最大节点不是根节点,则交换根节点和最大节点,并继续调整子树
    16. if (largest != k) {
    17. int temp = arr[k];
    18. arr[k] = arr[largest];
    19. arr[largest] = temp;
    20. heapify(arr, n, largest);
    21. }
    22. }
    23. // 堆排序函数
    24. void heapSort(int arr[], int n) {
    25. // 构建最大堆
    26. for (int i = n / 2 - 1; i >= 0; i--) {
    27. heapify(arr, n, i);
    28. }
    29. // 从堆顶开始取出元素,并重新调整堆
    30. for (int i = n - 1; i >= 0; i--) {
    31. int temp = arr[0];
    32. arr[0] = arr[i];
    33. arr[i] = temp;
    34. heapify(arr, i, 0);
    35. }
    36. }
    37. int main() {
    38. int arr[] = {10, 7, 8, 9, 1, 5};
    39. int n = sizeof(arr) / sizeof(arr[0]);
    40. printf("Original array: ");
    41. for (int i = 0; i < n; i++) {
    42. printf("%d ", arr[i]);
    43. }
    44. printf("\n");
    45. heapSort(arr, n);
    46. printf("Sorted array: ");
    47. for (int i = 0; i < n; i++) {
    48. printf("%d ", arr[i]);
    49. }
    50. printf("\n");
    51. return 0;
    52. }

    该代码中,heapify函数将以k为根的子树调整为最大堆,heapSort函数则先构建最大堆,然后从堆顶开始取出元素并重新调整堆,最终得到排序后的数组。

  • 相关阅读:
    Spark-RDD知识点
    最近公共祖先离线做法(tarjan)
    注意力机制 - 注意力评分函数
    Map集合(超详解)
    友元,静态关键字,静态方法以及对象间的关系
    嵌入式开发-11 Linux下GDB调试工具
    ROX NHS ester, 5-isomer(209734-74-7,344402-35-3)_ROX NHS酯5-异构体
    【云原生】详解 Zookeeper + Kafka on K8S 环境部署
    Day5 计算机网络分层结构——OSI、TCP/IP、五层参考模型
    php文件操作
  • 原文地址:https://blog.csdn.net/MyLovelyJay/article/details/133001675