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] = '\0'; 24 25 printf("\n"); 26 HeapSort(a, n); 27 } 28 29 //堆排序(从小到大) 30 void HeapSort(int a[], int n) 31 { 32 printf("\n堆排序后的结果(从小到大):"); 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("\n\n"); 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 }
结果