堆排序

来源:互联网 发布:java发邮件 编辑:程序博客网 时间:2024/06/05 09:50

 原理图如下:



思路如下:

以一个子树为单位,向上遍历。判断同父两个叶子大小(若只有一个跳过),选出最大。判断大的那个叶子节点与父节点,若父节点比大的叶子节点小则交换值。如此反复。



实现如下:

/*                         堆排序                       罗进瑶完成于2016-8-8 *********main.c*****************/#include<stdio.h>void show(int *a, int size){int i;for (i = 0;i <size;i++)printf("%d、", a[i]);}void findmax(int *a,int size){int i, parent, child,temp;for (i = size - 1;i > 0;i--){    child=i;parent = child / 2;if (child + 1 < size&&a[child + 1] > a[child])child++;if (a[parent] < a[child]){temp = a[parent];a[parent] = a[child];a[child] = temp;}}}void HeapSort(int *a, int size){int i,temp;for (i = size;i > 0;i--){findmax(a, i);temp = a[0];a[0] = a[i - 1];a[i - 1] = temp;}}int main(void) {//int a[10] = { 10,9,8,7,6,5,4,3,2,1};int a[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("原数据:");show(a, 10);printf("\n排序后:");//findmax(a, 10);HeapSort(a, 10);show(a, 10);putchar('\n');return 0;}

0 0
原创粉丝点击