现有一无序数组,用两种算法进行排序。
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();
}
}
以上两种排序算法,希望大家能够理解。