zoukankan      html  css  js  c++  java
  • c语言数据结构之 堆排序

    算法:先生成随机数,赋值到数组,将数组第一个元素a[0]设置为哨兵,函数调用数组和随机数个数n,再设定n/2的根结点与孩子结点进行比较操作,若右孩子存在,则选出三个数里最小的数赋值给根节点,如果右孩子不存在,则只需比较左孩子与根节点大小,一直循环操作至a[1],再从a[2]开始进行根结点与孩子结点进行比较操作,一直到n/2为止,最后,依次输出a[1],输出后将a[n]赋值给a[1];再进行递归操作,重复以上步骤,直至数组为空

    要点:画出二叉树是方便理解,并非数据的结构就是如同二叉树那般存储,存储形式还是一排

    编译器:VS2013

    代码

     1 #include "stdafx.h"
     2 #include<stdlib.h>
     3 
     4 //函数声明
     5 void HeapSort(int a[], int n); //堆排序(从小到大)
     6 void HSort(int a[], int n);    //辅助堆排序
     7 void Change(int &a, int &b);    //值互换
     8 
     9 int main()
    10  {
    11     int i, n, a[100];
    12 
    13     printf("请输入需要排序元素的个数:");
    14     scanf_s("%d", &n);
    15 
    16     printf("随机生成的数组为:");
    17     for (i = 1; i <= n; i++)
    18     {
    19         a[i] = rand() % 100 + 1;
    20         printf("%d ", a[i]);
    21     }
    22 
    23     a[i] = '';
    24 
    25     printf("
    ");
    26     HeapSort(a, n);
    27  }
    28 
    29 //堆排序(从小到大)
    30 void HeapSort(int a[], int n)
    31 {
    32     printf("
    堆排序后的结果(从小到大):");
    33 
    34     while (n)
    35     {
    36         HSort(a, n);
    37 
    38         printf("%d ", a[1]);
    39         a[1] = a[n];
    40 
    41         n--;
    42     }
    43 
    44     printf("
    
    ");
    45 }
    46 
    47 
    48 
    49 //辅助堆排序(从小到大)
    50 
    51 void HSort(int a[], int n)
    52 {
    53     int i = n / 2, k;
    54 
    55     while (i)
    56     {
    57         k = 2 * i;
    58 
    59         if (k<n&&a[k] >a[k + 1])
    60             k++;
    61 
    62         if (a[i] > a[k])
    63             Change(a[i], a[k]);
    64 
    65         i--;
    66     }
    67 
    68     for (i = 2; i <= n / 2; i++)
    69     {
    70         k = 2 * i;
    71 
    72         if (k<n&&a[k] > a[k + 1])
    73             k++;
    74 
    75         if (a[i] > a[k])
    76             Change(a[i], a[k]);
    77 
    78     }
    79 
    80 }
    81 
    82 
    83 
    84 //值互换
    85 void Change(int &a, int &b)
    86 {
    87     int t;
    88 
    89     t = a;
    90     a = b;
    91     b = t;
    92 }

    结果

  • 相关阅读:
    Leetcode Spiral Matrix
    Leetcode Sqrt(x)
    Leetcode Pow(x,n)
    Leetcode Rotate Image
    Leetcode Multiply Strings
    Leetcode Length of Last Word
    Topcoder SRM 626 DIV2 SumOfPower
    Topcoder SRM 626 DIV2 FixedDiceGameDiv2
    Leetcode Largest Rectangle in Histogram
    Leetcode Set Matrix Zeroes
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/6209647.html
Copyright © 2011-2022 走看看