您的位置:首页 > 其它

堆排序、中序排序算法实现

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;

根节点与最后一个节点交换;

缩小树,递归执行。

上代码:

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();

}

}


以上两种排序算法,希望大家能够理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 二叉树