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 }

结果

原文地址:https://www.cnblogs.com/cdp1591652208/p/6209647.html