九度OJ 1202 排序 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1202
- 题目描述:
-
对输入的n个数进行排序并输出。
- 输入:
-
输入的第一行包括一个整数n(1<=n<=100)。
接下来的一行包括n个整数。
- 输出:
-
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。
每组测试数据的结果占一行。
- 样例输入:
-
4 1 4 3 2
- 样例输出:
-
1 2 3 4
#include <stdio.h> #include <stdlib.h> void HeapSort(int Array[], int len); void BuildMaxHeap(int Array[], int len); void ShiftDown(int Array[], int index, int len); void Swap(int *m, int *n); int main(void){ int len; int * Array; int i; while (scanf("%d", &len) != EOF){ //读入数据个数 Array = (int *)malloc(sizeof(int) * (len+1)); for (i=1; i<=len; ++i) //读入数据 scanf("%d", &Array[i]); BuildMaxHeap(Array, len); HeapSort(Array, len); for (i=1; i<=len; ++i) printf("%d ", Array[i]); printf("\n"); free(Array); } return 0; } void HeapSort(int Array[], int len){ int i; int time = len; for (i=0; i<len; ++i){ Swap(&Array[1], &Array[time]); --time; ShiftDown(Array, 1, time); } } void BuildMaxHeap(int Array[], int len){ int index = len/2; for (; index>0; --index){ ShiftDown(Array, index, len); } } void ShiftDown(int Array[], int index, int len){ while ((2*index) <= len || (2*index+1) <= len){ if (2*index+1 <= len){ if (Array[index] < Array[2*index] || Array[index] < Array[2*index+1]){ if (Array[2*index] > Array[2*index+1]){ Swap(&Array[index], &Array[2*index]); index = 2*index; } else{ Swap(&Array[index], &Array[2*index+1]); index = 2*index + 1; } } else break; } else{ if (Array[index] < Array[2*index]){ Swap(&Array[index], &Array[2*index]); index = 2*index; } else break; } } } void Swap(int *m, int *n){ //交换数据 int tmp; tmp = *m; *m = *n; *n = tmp; }
参考资料:http://blog.csdn.net/v_july_v/article/details/6198644