选择类排序---堆排序
2016-03-06 16:50
519 查看
堆存储:
堆的数据实际是保存在数组中的,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。使用数组进行存储,使用完全二叉树作为分析结构。
![](https://img-blog.csdn.net/20160306163346137)
大根堆:根节点的值大于等于左右子树的值
小根堆:根节点的值小于等于左右子树的值
堆排序主要有几个操作步骤:
1> 初始化堆:先将一个数组初始化为一颗完全二叉树,再利用筛选的方法逐层向上把所有子树调整为大根堆(小根堆)。
2> 取出根节点的值,最后一个叶子节点的值赋予根节点,再次调节堆为大根堆(小根堆)。
堆的数据实际是保存在数组中的,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。使用数组进行存储,使用完全二叉树作为分析结构。
大根堆:根节点的值大于等于左右子树的值
小根堆:根节点的值小于等于左右子树的值
堆排序主要有几个操作步骤:
1> 初始化堆:先将一个数组初始化为一颗完全二叉树,再利用筛选的方法逐层向上把所有子树调整为大根堆(小根堆)。
2> 取出根节点的值,最后一个叶子节点的值赋予根节点,再次调节堆为大根堆(小根堆)。
/*====================================================== > File Name: heapSortSelf.c > Author: panlu > E-mail: view@xiyoulinux.org > Other : 堆排序 > Created Time: 2015年12月15日 星期二 21时51分18秒 =======================================================*/ #include<stdio.h> #define Lchild(i) (2*i+1) //某个节点的左子树节点位置 #define Rchild(i) (2*i+2) //某个节点的右子树节点位置 void swap(int *i,int *j){ int temp = *i; *i = *j; *j = temp; } void heapLittle(int *array,int length,int current_node){ //只是进行小根堆的初始化,current_node是当前数字在数组中的下标 int l_child = Lchild(current_node); int r_child = Rchild(current_node); int min = current_node; if(array[current_node] > array[l_child] && l_child < length){ //若左子树的值比自己的小,则把左子树提上去 swap(array+current_node,array+l_child); min = l_child; } if(array[current_node] > array[r_child] && r_child < length){ swap(array+current_node,array+r_child); min = r_child; } if(min!=current_node){ heapLittle(array,length,l_child); //发现有改动之后就把该节点的左子树下面再进行调整 heapLittle(array,length,r_child); //调整右子树 } } void initHeap(int *array,int length){ //将数组改造成堆 int i = length/2-1; //从第一个非叶子节点开始往上继续调整 for(; i >= 0; i--){ heapLittle(array,length,i); } } void heapSort(int *array,int length){ int cur = length-1; array[0] = array[cur]; initHeap(array,cur); } int main(){ int length; int i = 0; int array[20]; printf("请输入数组的长度: "); scanf("%d",&length); printf("请输入数组的值: \n"); for(; i < length; i++){ scanf("%d",array+i); } initHeap(array,length); for(i =0 ; i< length; i++){ printf("%d ",array[i]); } printf("\n-------aftersort-------"); printf("\n"); for(i = length; i > 0; i--){ printf("%d ",array[0]); //循环取出根节点的值 heapSort(array,i); } }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)