一日一码06——堆排序
来源:互联网 发布:php header用法404 编辑:程序博客网 时间:2024/06/03 16:00
这个堆排序算法,采用的是最大堆;最小堆,通常在构造最小优先队列时使用。
//堆排序2013/09/29#include <stdio.h>#include <stdlib.h>#include <time.h>#include <malloc.h>int heapSize = 0;void swap(int *a, int *b){int tmp = *a;*a = *b;*b = tmp;}int left(int p){return 2*p+1; //下标从0开始的写法,如果从1开始,左子节点为2*p}int right(int p){return 2*p + 2;}int parent(int n){return (n - 1)/2;}void maxHeapify(int *a, int i){int l,r,largest;l = left(i);r = right(i);if ( l < heapSize && a[l] > a[i]) //不要写成l <= heapSize,会导致排序出错{largest = l;}else{largest = i;}if ( r < heapSize && a[r] > a[largest]){largest = r;}if (largest != i){swap(&a[largest],&a[i]);maxHeapify(a,largest);}}void buildMaxHeap(int *a){int i;for (i = (heapSize - 1) / 2; i >= 0 ; --i) //关键点,避免了对叶子节点进行maxHeapify操作{maxHeapify(a,i);}}void heapSort(int *a){int i;for (i = heapSize - 1; i > 0; --i){swap(&a[i],&a[0]);heapSize--;//千万不要漏了maxHeapify(a,0);}}int initArr(int** a){int i,n;srand(time(NULL));printf("Input the size of array:");scanf("%d",&n);*a = (int *)malloc(n*sizeof(int));for(i = 0; i < n; i++){(*a)[i] = rand()%100; }return n;}void printArr(int* a, int n){int i;for (i = 0;i < n; i++){printf("%d,",a[i]);}printf("\n");}void main(){int* arr;int n;n = initArr(&arr);heapSize = n;printArr(arr,n);// maxHeapify(arr,0);buildMaxHeap(arr);heapSort(arr);printArr(arr,n);//printf("%d\n",0/2 );}
- 一日一码06——堆排序
- Python一日一练12----堆排序
- 一日一码01——冒泡排序
- 一日一码02——选择排序
- 一日一码03——插入排序
- 一日一码04——快速排序
- 一日一码05--希尔排序
- 一日一码07——链表
- 一日一码08——约瑟夫环
- 排序算法—堆和堆排序
- 16周—项目(一)—堆排序
- 第十六周项目一 验证算法——堆排序
- 第十五周项目一(6)——堆排序
- 第十五周项目一(6)——堆排序
- 排序——堆排序
- 排序——堆排序
- 排序——堆排序
- 排序——堆排序
- Apache 2.4 的ip保护(Order, Deny, Allow, Require)
- Tomcat创建并发布WAR文件
- error C2065: 'new' : undeclared identifier,主要是因为是.C文件
- H264标准句法表中C的含义理解
- 【笔记】 C#调用API函数
- 一日一码06——堆排序
- memory leak
- 关于php的chmod函数的问题
- http协议详解-个人培训记
- u012288604的专栏
- JAVA _method
- Linux常用命令速查
- ABAP中的异常处理 - TRY CATCH的使用实例
- 内存5种类型