堆排序算法
2014-02-05 11:51
211 查看
// HeapSort.c #include <stdio.h> #include <time.h> #include <stdlib.h> typedef int DataType; typedef unsigned char NumType; // 有效个数:2至255 // ( ( 2 ^ ( sizeof ( NumType ) * 8 ) ) - 1 ) #define LIMIT ( ( 1 << ( sizeof ( NumType ) << 3 ) ) - 1 ) typedef unsigned short TYPE; // TYPE比NumType大一个级别的数据类型单位 void ShiftDown(DataType * const, NumType, NumType); void HeapSort(DataType * const, const NumType); int main(void) { NumType i, sum; DataType data[LIMIT] = { 0 }; srand((unsigned int)time(0)); puts("生成随机数:\n"); for (i = 0; i < LIMIT; ++i) { // 随机生成0至32767共计32768种随机数字 data[i] = rand(); printf("%-5d\t", data[i]); if (i % 10 == 9) putchar('\n'); } sum = sizeof(data) / sizeof(data[0]); // 数据个数溢出检测 if ((sizeof(sum) <= sizeof(NumType)) && (sum <= LIMIT) && (sum > 1)) HeapSort(data, sum); puts("\n\n堆排序后:\n"); for (i = 0; i < LIMIT; ++i) { printf("%-5d\t", data[i]); if (i % 10 == 9) putchar('\n'); } putchar('\n'); getch(); return 0; } /******************************以上代码仅供测试******************************/ // 堆排序 // data[k]插入data[k+1]至data 的堆中 void ShiftDown(DataType * const data, NumType k, NumType n) { #define FLAG 0 // FLAG = 0 升序排列 FLAG = 1 降序排列 TYPE j; DataType temp = data[k]; // 连续交换用循环传递实现 // for (j = 2 * k + 1; j <= n; k = j, j = 2 * k + 1) for (j = (k << 1) + 1; j <= n; k = j, j = (k << 1) + 1) { #if !FLAG // FLAG == 0 if ((j <= n - 1) && (data[j] < data[j + 1])) #elif FLAG // FLAG == 1 if ((j <= n - 1) && (data[j] > data[j + 1])) #endif ++j; #if !FLAG // FLAG == 0 if (temp >= data[j]) #elif FLAG // FLAG == 1 if (temp <= data[j]) #endif break; data[k] = data[j]; // 循环传递中 } data[k] = temp; // 循环传递结束 } void HeapSort(DataType * const data, const NumType sum) { if (sum > 1) { NumType i; DataType temp; // for (i = sum / 2 - 1; ; --i) for (i = (sum >> 1) - 1; ; --i) { ShiftDown(data, i, sum - 1); // if (i == 0) if (!i) break; } // for (i = sum - 1; i > 0; --i) for (i = sum - 1; i; --i) { temp = data[0]; data[0] = data[i]; data[i] = temp; ShiftDown(data, 0, i - 1); } } }