排序之内部排序 插入式排序

内部排序的插入式排序有三种,插入排序,希尔排序和二叉树排序

一 插入排序

public class InsertSort
{
 public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组

 public static void main(String args[])
 {
  int i; // 循环计数变量
  int Index = a.length;// 数据索引变量

  System.out.print("排序前 : ");
  for (i = 0; i < Index - 1; i++)
   System.out.print(" " + a[i] + " ");
  System.out.println("");

  InsertSort(Index - 1); // 选择排序
  // 排序后结果
  System.out.print("排序后: ");
  for (i = 0; i < Index - 1; i++)
   System.out.print(" " + a[i] + " ");
  System.out.println("");
 }

 public static void InsertSort(int Index)
 {
  int i, j, k; // 循环计数变量
  int InsertNode; // 欲插入数据变量

  for (i = 1; i < Index; i++) // 依序插入数值
  {
   InsertNode = a[i]; // 设定欲插入的数值
   j = i - 1; // 欲插入数组的开始位置
   // 找适当的插入位置
   while (j >= 0 && InsertNode < a[j])
   {
    a[j + 1] = a[j];
    j--;
   }
   a[j + 1] = InsertNode; // 将数值插入
   // 打印目前排序结果
   System.out.print("目前排序结果 : ");
   for (k = 0; k < Index; k++)
    System.out.print(" " + a[k] + " ");
   System.out.println("");
  }
 }
}

二 希尔排序

public class ShellSort
{
 public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组

 public static void main(String args[])
 {
  int i; // 循环计数变量
  int Index = a.length;// 数据索引变量

  System.out.print("排序前 : ");
  for (i = 0; i < Index - 1; i++)
   System.out.print(" " + a[i] + " ");
  System.out.println("");

  ShellSort(Index - 1); // 选择排序
  // 排序后结果
  System.out.print("排序后: ");
  for (i = 0; i < Index - 1; i++)
   System.out.print(" " + a[i] + " ");
  System.out.println("");
 }

 public static void ShellSort(int Index)
 {
  int i, j, k; // 循环计数变量
  int Temp; // 暂存变量
  boolean Change; // 数据是否改变
  int DataLength; // 分割集合的间隔长度
  int Pointer; // 进行处理的位置

  DataLength = (int) Index / 2; // 初始集合间隔长度

  while (DataLength != 0) // 数列仍可进行分割
  {
   // 对各个集合进行处理
   for (j = DataLength; j < Index; j++)
   {
    Change = false;
    Temp = a[j]; // 暂存Data[j]的值,待交换值时用
    Pointer = j - DataLength; // 计算进行处理的位置

    // 进行集合内数值的比较与交换值
    while (Temp < a[Pointer] && Pointer >= 0 && Pointer <= Index)
    {
     a[Pointer + DataLength] = a[Pointer];
     // 计算下一个欲进行处理的位置
     Pointer = Pointer - DataLength;
     Change = true;
     if (Pointer < 0 || Pointer > Index)
      break;
    }
    // 与最后的数值交换
    a[Pointer + DataLength] = Temp;

    if (Change)
    {
     // 打印目前排序结果
     System.out.print("目前排序结果 : ");
     for (k = 0; k < Index; k++)
      System.out.print(" " + a[k]);
     System.out.println("");
    }
   }
   DataLength = DataLength / 2; // 计算下次分割的间隔长度
  }
 }
}

三 二叉树排序

import util.ConsoleReader;

public class BTreeSort
{
 public static int[] Data = new int[20]; // 预设数据数组

 public static void main(String args[])
 {
  int i; // 循环计数变量
  int Index = 1; // 数据索引变量
  BNTreeArray BNTree = new BNTreeArray(); // 声明二叉树数组

  System.out.println("输入排序数字,输入0结束:");

  ConsoleReader console = new ConsoleReader(System.in);

  System.out.print("Data " + Index + " : ");
  Data[Index] = console.readInt();
  BNTree.TreeData[0] = Data[Index];
  Index++;

  while (true) // 读取输入值
  {
   System.out.print("Data " + Index + " : ");
   Data[Index] = console.readInt();
   if (Data[Index] == 0)
    break;
   BNTree.Create(Data[Index]); // 建立二叉查找树
   Index++;
  }

  // 排序前数据内容
  System.out.print("排序前数据内容 : ");
  for (i = 1; i < Index; i++)
   System.out.print(" " + Data[i] + " ");
  System.out.println("");

  // 排序后结果
  System.out.print("排序后结果 : ");
  BNTree.InOrder(0); // 中序遍历
 }
}

class BNTreeArray
{
 public static int MaxSize  = 20;
 public static int[] TreeData = new int[MaxSize];
 public static int[] RightNode = new int[MaxSize];
 public static int[] LeftNode = new int[MaxSize];

 public BNTreeArray()
 {
  int i; // 循环计数变量

  for (i = 0; i < MaxSize; i++)
  {
   TreeData[i] = 0;
   RightNode[i] = -1;
   LeftNode[i] = -1;
  }
 }

 // ----------------------------------------------------
 // 建立二叉树
 // ----------------------------------------------------
 public void Create(int Data)
 {
  int i; // 循环计数变量
  int Level = 0; // 树的阶层数
  int Position = 0;

  for (i = 0; TreeData[i] != 0; i++)
   ;

  TreeData[i] = Data;
  while (true) // 寻找节点位置
  {
   // 判断是左子树或是右子树
   if (Data > TreeData[Level])
   {
    // 右树是否有下一阶层
    if (RightNode[Level] != -1)
     Level = RightNode[Level];
    else
    {
     Position = -1; // 设定为右树
     break;
    }
   } else
   {
    // 左树是否有下一阶层
    if (LeftNode[Level] != -1)
     Level = LeftNode[Level];
    else
    {
     Position = 1; // 设定为左树
     break;
    }
   }
  }

  if (Position == 1) // 建立节点的左右连结
   LeftNode[Level] = i; // 连结左子树
  else
   RightNode[Level] = i; // 连结右子树
 }

 // ---------------------------------------------------------
 // 二叉树中序遍历
 // ---------------------------------------------------------
 public static void InOrder(int Pointer)
 {
  if (Pointer != -1) // 遍历的终止条件
  {
   InOrder(LeftNode[Pointer]); // 处理左子树
   // 处理打印节点内容
   System.out.print(" " + TreeData[Pointer] + " ");
   InOrder(RightNode[Pointer]); // 处理右子树
  }
 }
}

 

util类

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;

/**
 * 从命令行获得数据输入
 * @author myjava_024
 */
public class ConsoleReader

 public ConsoleReader(InputStream inStream)
    {
     reader = new BufferedReader (new InputStreamReader(inStream));
    }
  
 public int readInt()   // ��������
    { 
     String inputString = readLine();
        int n = Integer.parseInt(inputString);
        
        return n;
    }
  
 public double readDouble()  // ����������
    { 
     String inputString = readLine();
        double x = Double.parseDouble(inputString);
        
        return x;
    }

 public String readLine()
    { 
     String inputLine = "";
     
        try
        {
         inputLine = reader.readLine();
        }
        catch(IOException e)
        {
         System.out.println(e);
           System.exit(1);
        }

        return inputLine;
    }
    
    private BufferedReader reader;
}

 

到现在为止,内部排序的就写到这了,以后就要开始其他方面的学习了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值