堆排序、中序排序算法实现
2017-09-20 12:14
190 查看
现有一无序数组,用两种算法进行排序。
int[] ints = {5,7,2,5,8,9,3,4,6};
第一种:堆排序
算法:
从数组索引的第一个位置开始构建二叉树(从左到右,最多两个子节点)
构建最大堆:
从下倒上,从右到左比较最大儿子节点,如果最大儿子比父节点大,则对换;
确定节点关系 :
父节点个数PC=(L-1)/2 ;
父节点的索引方式(反向遍历,由PC - 1);
子节点的索引:左孩子=PC*2;右孩子=左孩子+1;
根节点与最后一个节点交换;
缩小树,递归执行。
上代码:
第二种:中序排序
算法:
节点数据增添时,按顺序二叉树,左小右大添加;
遍历时按中序遍历。
实现:
创建节点类:Node 、数据操作类:DoubleTree
上代码:
以上两种排序算法,希望大家能够理解。
int[] ints = {5,7,2,5,8,9,3,4,6};
第一种:堆排序
算法:
从数组索引的第一个位置开始构建二叉树(从左到右,最多两个子节点)
构建最大堆:
从下倒上,从右到左比较最大儿子节点,如果最大儿子比父节点大,则对换;
确定节点关系 :
父节点个数PC=(L-1)/2 ;
父节点的索引方式(反向遍历,由PC - 1);
子节点的索引:左孩子=PC*2;右孩子=左孩子+1;
根节点与最后一个节点交换;
缩小树,递归执行。
上代码:
public static void sortByTree(int[] unSortArray){ int size = unSortArray.length; while (size > 2){ //最大堆 //循环所有父节点(从后向前循环) for(int i=(size-1)/2;i>=1;i--) { //先找到最大的儿子节点,假设为左儿子 int maxIndex = i * 2; //右儿子存在,且比左儿子大 if(maxIndex + 1 < size && unSortArray[maxIndex + 1] > unSortArray[maxIndex]){ maxIndex ++; } //最大儿子与父节点进行比较 if(unSortArray[maxIndex] > unSortArray[i]){ int temp = unSortArray[maxIndex]; unSortArray[maxIndex] = unSortArray[i]; unSortArray[i] = temp; } } //将根节点与最后一个节点交换 int data = unSortArray[1]; unSortArray[1] = unSortArray[size - 1]; unSortArray[size - 1] = data; size -- ; } } public static void main(String[] args) { int[] ints = {5,7,2,5,8,9,3,4,6}; sortByTree(ints); for (int i = 1; i < ints.length; i++) { System.out.println(ints[i]); } }
第二种:中序排序
算法:
节点数据增添时,按顺序二叉树,左小右大添加;
遍历时按中序遍历。
实现:
创建节点类:Node 、数据操作类:DoubleTree
上代码:
public class Node { int value ; Node left; Node right; public Node(int value) { this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public Node getLeft() { return left; } public void setLeft(Node left) { this.left = left; } public Node getRight() { return right; } public void setRight(Node right) { this.right = right; } }
public class DoubleTree { Node root; /** * 顺序添加,满足中序排序要求 * @param value */ public void add(int value){ Node node = new Node(value); if(null == root) { root = node; } else { Node temp = root; while (true) { if(value <temp.getValue()){ if(null == temp.getLeft()){ temp.setLeft(node); break; } else { temp = temp.getLeft(); } } else { if(null == temp.getRight()){ temp.setRight(node); break; } else { temp = temp.getRight(); } } } } } /** * 打印输出 */ public void show(){ showNode(root); } /** * 中序遍历 * 条件: * 1、顺序二叉树:左小右大 * @param pnode */ private void showNode(Node pnode){ //前序遍历 // System.out.println(pnode.getValue()); if(null !=pnode.getLeft()){ showNode(pnode.getLeft()); } //中序遍历 System.out.println(pnode.getValue()); if(null !=pnode.getRight()){ showNode(pnode.getRight()); } //后续遍历 // System.out.println(pnode.getValue()); } public static void main(String[] args) { DoubleTree doubleTree = new DoubleTree(); doubleTree.add(5); doubleTree.add(2); doubleTree.add(7); doubleTree.add(4); doubleTree.add(6); doubleTree.add(9); doubleTree.add(3); doubleTree.add(6); doubleTree.add(8); doubleTree.show(); } }
以上两种排序算法,希望大家能够理解。
相关文章推荐
- 【排序算法】之堆排序的实现
- 排序算法(四)堆排序的Python实现及算法详解
- 排序算法总结(简单选择排序、堆排序)(python实现)
- 常用排序算法C++实现(堆排序,快速排序,归并排序,基数排序)
- 排序算法(2) 堆排序 C++实现
- PHP实现排序算法----堆排序(Heap Sort)
- [置顶] 排序算法之堆排序 Java 实现
- 排序算法的数组实现 -- 堆排序(二)
- 排序算法(七):JAVA实现堆排序
- 常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- Java实现排序算法——堆排序
- 五种经典排序算法的实现(冒泡、归并、快排、堆排序、希尔)
- 排序算法三:堆排序基本原理以及Python实现
- 【转】排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序
- 八种排序算法Java实现-堆排序
- 【排序算法】堆排序原理及Java实现
- 排序算法(C实现)--------- 堆排序
- 常见排序算法的实现(三)——堆排序
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)