排序法-改良的选择排序(C)
来源:互联网 发布:tcp udp 端口 编辑:程序博客网 时间:2024/05/29 09:21
Heap排序法使用Heap Tree(堆积树),树是一种资料结构,而堆积树是一个二元树,也就是每一个父节点最多只有两个子节点(关于树的详细定义还请见资料结构书籍),堆积树的 父节点
若小于子节点,则称之为最小堆积(Min Heap ),父节点若大于子节点,则称之为最大堆积( Max Heap),而同一层的子节点则无需理会其大小关系,例如下面就是一个堆积树:
我们可以用数组来存储堆积树的所有元素和顺序,索引我们定为从1开始,把左节点的索引记为s,则右节点为s+1,父节点为s/2,
就如上图所示,将上图的堆积树转换为一维阵列之后如下所示:
首先必须知道如何建立堆积树,加至堆积树的元素会先放置在最后一个树叶节点位置,然后检查父节点是否小于子节点(最小堆积),将小的元素不断与父节点交换,直到满足堆积树的条件
为止,例如在上图的堆积加入一个元素12,则堆积树的调整方式如下所示:
建立好堆积树之后,树根一定是所有元素的最小值,再将最小值取出,然后调整数为堆积树。
不断重复以上的步骤,就可以达到排序的效果,最小值的取出方式是将树根与最后一个树叶节点交换,然后切下树叶节点,重新调整树为堆积树,如下所示:
调整完毕后,树根节点又是最小值了,于是我们可以重覆这个步骤,再取出最小值,并调整树为堆积树,如下所示:
如此重覆步骤之后,由于使用一维阵列来储存堆积树,每一次将树叶与树根交换的动作就是将最小值放至后端的阵列,所以最后阵列就是变为已排序的状态。
C代码
#include<stdio.h>#include<stdlib.h>#define MAX 10void swap(int &a, int &b){ int temp; temp = a; a = b; b = temp;}void creat_heap(int *number){ int heap[MAX + 1] = { -1 }; int i, j; int s, p; for (i = 1; i < MAX + 1; i++) { heap[i] = number[i]; s = i; p = s / 2; while (heap[s] < heap[p] && s >= 2) { swap(heap[s], heap[p]); s = p; p = s / 2; } } for (i = 1; i < MAX + 1; i++) //printf("%d ", num[i]); number[i] = heap[i];}void heap_Sort(int *number){ int m = MAX; int p,s; while (m > 1) { swap(number[1], number[m]); m--; p = 1; //根节点 s = 2 * p;//左子节点 //重新调整为堆积树 while (s < m) { if (number[s+1] < number[s]) { s++; //右子节点 } swap(number[p], number[s]); p = s; //重新定义父节点 s = 2 * p; //父节点p的左子节点 } } for (int i = MAX; i > 0; i--) printf("%d ", number[i]);}int main(){ int num[11] = { -1,18,15,21,4,5,2,7,11,56,12 }; creat_heap(num); heap_Sort(num); system("pause"); return 0;}
阅读全文
0 0
- 排序法-改良的选择排序(C)
- 排序法:改良的选择排序
- 堆排序(改良的选择排序)
- shell排序法-改良的插入排序(C)
- 几种改良的排序,堆排序,希尔排序,快速排序--堆排序篇(改良的选择排序算法)
- 堆积排序(HeapSort) - 改良的选择排序
- 21 改良的选择排序--堆排序
- 排序算法---冒泡改良的选择排序
- Algorithm: Shell 排序法 (改良的插入排序)
- Shaker 排序法 - 改良的气泡排序
- 希尔排序(插入排序的改良)
- Shell排序(改良的插入排序)
- 6、C程序 数组排序之[二分插入排序法](插入排序法改良版)
- 选择排序法(C#)
- 算法 shell排序法 - 改良的插入排序
- 算法 Shaker排序法 - 改良的气泡排序
- 19 Shell 排序法 - 改良的插入排序
- shell(希尔)排序(改良的插入排序)
- 商城项目总结
- react系列(2)表达式语法
- 做技术,有没有必要参加IT培训
- Linux(centos7)下安装OpenSSL 安装图文详解
- 【java】--sleep wait 小结
- 排序法-改良的选择排序(C)
- 算法学习(一)-----朱流算法
- S-Nim HDU
- 结构体的使用以及结构体内存对齐
- 好久不更新博客,关于spark-scala上开发的总结
- laravel手把手教学
- spark中的广播变量与累加器
- 时间序列笔记(三)
- 莫比乌斯函数求和公式理解