堆排序
来源:互联网 发布:淘宝卖家使用尺码 编辑:程序博客网 时间:2024/06/14 18:10
一般的教科书上在heapsort函数构建堆的过程中写的是
for(i = N / 2;i >= 0; i--) { PercDown(A, i, n);}
实际上这个有丁点问题,数组是从下标0开始的,因此下标为i的结点的双亲为(i - 1) / 2;所以最后一个又孩子的结点的下标为(N - 1) / 2,读者可以亲自实验,因此应修正为:
for(i = (N - 1) / 2;i >= 0; i--) { PercDown(A, i, n);}
代码如下:
#include <stdio.h>#include <stdlib.h>#define LeftChild(i) (2 * i + 1)#define MaxNum 100void input(int A[],int *e);void output(int A[], int e);void PercDown(int A[], int i, int N);void heap_sort(int A[] , int N);int main(){ int num[MaxNum], N; input(num, &N); heap_sort(num, N); output(num, N); return 0;}void input(int A[],int *e) { int i; printf("请输入元素个数:"); scanf("%d",e); printf("请输入数组元素:"); for(i = 0; i < *e; i++) { scanf("%d", &A[i]); }}void output(int A[], int e) { int i; printf("排序后顺序:"); for(i = 0; i < e; i++) { printf("%d ",A[i]); }}void PercDown(int A[], int i, int N) { int child; int temp; for(temp = A[i]; LeftChild(i) < N; i = child) { child = LeftChild(i); if (child != N - 1 && A[child + 1] > A[child]) child++; if(temp < A[child]) A[i] = A[child]; else break; } A[i] = temp;}void heap_sort(int A[] , int N) { int i; int temp; for(i = (N - 1) / 2;i >= 0; i--) { PercDown(A, i, N); } for(i = N - 1; i > 0; i--) { temp = A[0]; A[0] = A[i]; A[i] = temp; PercDown(A, 0, i); }}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- leetcode Happy Number
- NSDateFormatter格式详解
- Dos命令大全
- Python 初探
- HttpConnection详解
- 堆排序
- hdu 1272 小希的迷宫
- 对汇编中子程序结构的认识
- cv::CascadeClassifier类在多次读取新版本xml模型时的错误及其修正
- Android HttpConnection 使用
- Jprofiler工具安装及使用
- 霍夫曼压缩算法
- n+lua
- Nginx 负载均衡配置和策略