插入、冒泡、选择、归并、创建树、树的遍历的代码

来源:互联网 发布:中国当前网络消费现状 编辑:程序博客网 时间:2024/06/05 11:19
package com.phj.sort;import java.lang.reflect.Array;public class SortIt {/** * 交换 * @param array * @param i * @param j */public void swapInt(int[] array, int i ,int j){int temp = array[i];array[i] = array[j];array[j] = temp ;}/** * 打印 * @param array */public void printArray(int[] array){for (int i : array){System.out.print(i+" ");} System.out.println();}/** * 冒泡升序 * @param array */public void bubbleASC (int[] array){for (int i = 0; i < array.length-1; i++){for (int j = 0; j < array.length-i-1; j++) {if(array[j] > array[j+1]){swapInt(array, j, j+1);}}}}/** * 选择升序 * @param array */public void choiceASC(int[] array){int temp = 0;for (int i = 0; i < array.length-1; i++) {temp = i;for (int j = i + 1; j < array.length; j++){if(array[temp] > array[j]){temp = j;}}if(i != temp){swapInt(array, i, temp);}}}/** * 快排的分割函数 * @param array * @param low * @param high * @return */private int partition(int[] array,int low, int high){int index = array[low];while(low < high){while(high > low){if(array[high] < index){swapInt(array, low, high);break;}else{high = high - 1;}}while(low < high){if(array[low] > index){swapInt(array, high, low);break;}else{low = low + 1;}}}return low;}/** * 快排 * @param array * @param low * @param high */public void quickChoose(int[] array,int low ,int high){if(low < high){int m = partition(array,low,high);quickChoose(array, low, m-1);quickChoose(array, m+1, high);}}/** * 归并排序 合并2个有序数组 * @param array * @param temp * @param start * @param mid * @param end */public void merge(int[] array, int start,int mid , int end){int i = start ;int j = mid + 1;int k = start;int m = mid - start + 1;int n = end - mid;int[] left = new int[m];int[] right = new int[n];for (i = 0, k = start; i < m; i++, k++) {left[i] = array[k];}for (j = 0, k = mid + 1; j < n; j++, k++) {right[j] = array[k];}for (i = 0, j = 0, k = start; i < m && j < n; k++) {if(left[i] < right[j]){array[k] = left[i];i = i + 1;}else{array[k] = right[j];j = j + 1;}}if(i < m){for (; i < m; i++, k++) {array[k] = left[i];}}if(j < n){for (; j < n; j++, k++) {array[k] = right[j];}}left = null;right = null;}/** *  利用递归进行 归并排序 * @param array * @param s * @param t */public void mergeSort(int[] array, int s , int t){if(s < t){int m = (s + t)/2;mergeSort(array, s, m);mergeSort(array, m+1, t);merge(array, s, m, t);}}/** * 用于调用的归并函数 * @param array */public void mSort(int[] array){mergeSort(array,0, array.length-1);}public void main(String[] args) {int[] abc = {123,32,90,54,71,12,200};mSort(abc);for (int i : abc) {System.out.print(i+" ");}System.out.println();}/** * 插入排序 * @param a * @param n */public void insertSort(int a[],int n){int k,t;for (int j=0; j<n; j++){/*这个实际上就是直接插入排序*/t = a[j];for (k=j-1; k>=0 && t<a[k]; k--){a[k + 1] = a[k];}a[k + 1] = t;}}    /**     * 二分查找     *      * 注意:二分查找只是针对有序排列的各种数组或集合     *      * @param target     * @param array     * @return     */    public boolean binarySearch(int target, int[] array)    {        int front = 0;        int tail = array.length - 1;        // 判断子数组是否能再次二分        while (front <= tail)         {            // 获取子数组的中间位置,并依据此中间位置进行二分            int middle = (front + tail) / 2;            if (array[middle] == target)            {                return true;            }             else if (array[middle] > target)            {                tail = middle - 1;            }            else            {                front = middle + 1;            }        }        return false;    }//end}


 

package com.phj.sort;import java.io.File;import java.io.FileNotFoundException;import java.util.Queue;import java.util.Scanner;import java.util.Stack;import java.util.concurrent.LinkedBlockingQueue;/** * 创建二叉树 * @author LENOVO * * @param <T> */public class Tree<T> {       private Node<T> root;            public Tree()     {      }        public Tree(Node<T> root)    {         this.root = root;      }            //创建二叉树      public void buildTree()    {                   Scanner scn = null;          try         {              scn = new Scanner(new File("inputtxt"));          }         catch (FileNotFoundException e)        {              e.printStackTrace();          }          root = createTree(root,scn);              }      //先序遍历创建二叉树      private Node<T> createTree(Node<T> node,Scanner scn)     {                    String temp  = scn.next();                    if (temp.trim().equals("#"))        {              return null;          }         else        {              node = new Node<T>((T)temp);              node.setLeft(createTree(node.getLeft(), scn));              node.setRight(createTree(node.getRight(), scn));              return node;          }      }            //中序遍历(递归)      public void inOrderTraverse()     {          inOrderTraverse(root);      }            public void inOrderTraverse(Node<T> node)     {          if (node != null)         {              inOrderTraverse(node.getLeft());              System.out.println(node.getValue());              inOrderTraverse(node.getRight());          }      }                  //中序遍历(非递归)      public void nrInOrderTraverse()     {          Stack<Node<T>> stack = new Stack<Node<T>>();          Node<T> node = root;          while (node != null || !stack.isEmpty())         {              while (node != null)             {                  stack.push(node);                  node = node.getLeft();              }              node = stack.pop();              System.out.println(node.getValue());              node = node.getRight();          }                        }      //先序遍历(递归)      public void preOrderTraverse()     {          preOrderTraverse(root);      }            public void preOrderTraverse(Node<T> node)    {          if (node != null)         {              System.out.println(node.getValue());              preOrderTraverse(node.getLeft());              preOrderTraverse(node.getRight());          }      }                  //先序遍历(非递归)      public void nrPreOrderTraverse()    {          Stack<Node<T>> stack = new Stack<Node<T>>();          Node<T> node = root;                   while (node != null || !stack.isEmpty())        {                            while (node != null)             {                  System.out.println(node.getValue());                  stack.push(node);                  node = node.getLeft();              }              node = stack.pop();              node = node.getRight();          }                        }            //后序遍历(递归)      public void postOrderTraverse()     {          postOrderTraverse(root);      }            public void postOrderTraverse(Node<T> node)    {          if (node != null)         {              postOrderTraverse(node.getLeft());              postOrderTraverse(node.getRight());              System.out.println(node.getValue());          }      }            //后续遍历(非递归)      public void nrPostOrderTraverse()     {          Stack<Node<T>> stack = new Stack<Node<T>>();          Node<T> node = root;          Node<T> preNode = null;//表示最近一次访问的节点                    while (node != null || !stack.isEmpty())        {                            while (node != null)             {                  stack.push(node);                  node = node.getLeft();              }                            node = stack.peek();                            if (node.getRight() == null || node.getRight() == preNode)            {                  System.out.println(node.getValue());                  node = stack.pop();                  preNode = node;                  node = null;              }            else            {                  node = node.getRight();              }          }      }            //按层次遍历      public void levelTraverse()     {          levelTraverse(root);      }            public void levelTraverse(Node<T> node)     {          Queue<Node<T>> queue = new LinkedBlockingQueue<Node<T>>();          queue.add(node);          while (!queue.isEmpty())         {                            Node<T> temp = queue.poll();              if (temp != null)             {                  System.out.println(temp.getValue());                  queue.add(temp.getLeft());                  queue.add(temp.getRight());              }                                    }                        }  }    //树的节点  class Node<T> {      private Node<T> left;      private Node<T> right;      private T value;            public Node()     {      }      public Node(Node<T> left,Node<T> right,T value)     {          this.left = left;          this.right = right;          this.value = value;      }            public Node(T value)    {          this(null,null,value);      }      public Node<T> getLeft()    {          return left;      }      public void setLeft(Node<T> left)    {          this.left = left;      }      public Node<T> getRight()    {          return right;      }      public void setRight(Node<T> right)     {          this.right = right;      }      public T getValue()     {      return value;      }      public void setValue(T value)     {      this.value = value;      }  }