堆排序
2015-11-12 14:17
330 查看
堆积(heap)是树结构的第三种型态堆积是一棵二元树
参考:《算法导论(第3版)》第6章
八大排序算法
代码:
参考:《算法导论(第3版)》第6章
八大排序算法
代码:
package algorithm; import java.util.Arrays; /** * Created by 刘一波 LiuYibo on 15/11/11. * E-Mail:zhanlanstar@163.com */ public class HeapSortMain { public static void main(String[] args) { int[] a = {12, 3, 5, 4, 2, 1, 33, 4, 89, 22, 120, 23, 14}; HeapSort heapSort = new HeapSort(); heapSort.sort(a); System.out.println(Arrays.toString(a)); } /** * 堆排序 * <p/> * 此排序过程: * 1. 建大根堆 * 2. 把第一个数字和最后一个交换。且已排序好的个数加1。即,大根堆建好后,第一个是最大的,把它放到最后即可。 * 3. 对于除最后排序好的个数外的数组进行建堆(重复1),交换(重复2),直到结束。 * <p/> * 这不是完全按照原始算法写的代码,所以可能效率不很高。 */ static class HeapSort { /** * 建堆,建大根堆。 * 一个过程: * 1. 每一次开始时,i=n/2,i的两个子节点分别是 2*i 和 2*i+1。 * 2. 如果两个子结点的序号在数组内,分别对其进行比较,把最大的放在父结点位置。 * 3. i-- 直到退出。 * 4. 重复1,2,3 直到没有交换,则完成。 * * @param a 待排序数组 * @param sorted 已经排序好的个数 */ public void heap(int[] a, int sorted) { while (true) { int flag = 0;//交换次数,未交换表明此数组已经符合大根堆条件 for (int i = (a.length - sorted) / 2; i >= 0; i--) { int x = i * 2; int y = i * 2 + 1; System.out.println(i + " " + x + " " + y); if (y <= (a.length - sorted - 1)) { if (a[i] < a[y]) { swap(a, i, y); flag++; } } if (x <= (a.length - sorted - 1)) { if (a[i] < a[x]) { swap(a, i, x); flag++; } } } if (flag == 0) { break; } } } /** * 排序 * <p/> * 1. 大根堆的第一个是最大的,移动到最后,把最后一个放在第一个位置(交换)。 * 2. 把剩余的数调整为大根堆。 * 3. 重复1,2,直到数组排序完成。 * * @param a */ public void sort(int[] a) { heap(a, 0); for (int i = 0; i < a.length; i++) { swap(a, 0, a.length - 1 - i); heap(a, i + 1); } } public void swap(int[] numbers, int one, int tow) { int temp = numbers[one]; numbers[one] = numbers[tow]; numbers[tow] = temp; System.out.println(Arrays.toString(numbers)); } } }
相关文章推荐
- Xamarin
- 二叉树的非递归遍历
- Linux 下的定时任务实现 at 和 crontab
- iOS中Quartz2D
- iOS工程路径,路径宏
- CentOS 配置Tomcat及搭配Nginx
- php用户注册信息验证正则表达式
- Android 实时时间显示实现
- 【转】那些年我们一起清除过的浮动
- Jackson
- 如何实现Android重启应用程序代码 ?
- js引用
- 【BZOJ】4154: [Ipsc2015]Generating Synergy【KD树】
- 创建GitHub技术博客全攻略
- Struts2中获取request、session等方法
- 移动开发的meta
- JS开发HTML5游戏《神奇的六边形》(一)
- 树的递归非递归实现前中后遍历,和求度为0 1 2的节点数和树的深度
- Android gdb 调试
- Uri编码,包括javascript前端与C#服务器端