java实现 数据结构之8大排序

数据结构中8大排序(java方式实现)

    

        * 冒泡排序

        * 插入排序

        * 选择排序

        * shell排序

        * 堆排序

        * 归并排序

        * 二叉树排序

        * 快速排序

    * 冒泡排序

     private void bubblesort() {

           int data [] = create();

           print (data );

           long start = start ();

           forint i =0 ; i< data .length - 1; i ++){

               forint j =i + 1; j <data . length; j ++){

                    if( data [i ]> data[ j ])

                         swap (i , j, data );

               }

           }

           end (start , "冒泡" );

           print (data );

      }

     private void swap( int i , int j , int [] data ) {

           int temp = 0 ;

          temp = data[ i ];

          data [ i] = data [ j];

          data [ j] = temp ;

      }

      public static long start (){

           return   System.currentTimeMillis ();

      }

      public static void  end (long start , String str ){

           long end = System.currentTimeMillis();

          System . out. println (str + "排序花费的时间  = "+( end- start ));

      }

     static int [] create () {

           int array [] = new int1000];

           forint i =0 ; i< 1000 ; i ++){

               try {

                   Thread . sleep( 1 );

               catch (InterruptedException e ) {

                    // TODO Auto-generated catch block

                   e . printStackTrace();

               }

              array [ i] = new Random (). nextInt( 100000 );

           }

           return array;

      }

    * 插入排序

     private void insertsort() {

           int data [] = create();

           print (data );

           long start = start ();

           int temp = 0 , j = 0;

           forint i =0 ; i< data .length ; i++){

              temp = data[ i ];

              j = i- 1 ;

               while( j >=0 && data[ j ]>temp ){

                   data [ j+ 1 ] = data[ j ];

                   j --;

               }

              data [ j+ 1 ] = temp;

           }

           end (start , "插入" );

           print (data );

      }

    * 选择排序

     private void selectsort() {

           int data [] = create();

           print (data );

           int k =0 ;

           long start = start ();

           forint i =0 ; i< data .length - 1; i ++){

              k = i;

               forint j =i + 1; j <data . length; j ++){

                    if( data [k ]> data[ j ]){

                        k = j;

                    }

               }

               swap (i , k, data );

           }

           end (start , "选择" );

           print (data );

      }

    * shell 排序

private void shellsort() {

           int data [] = create();

           print (data );

           long start = start ();

           int j = 0 ;

           int temp = 0 ;

           int gap = 0 ;

           int n = data . length;

           while( gap <data . length){

              gap = gap* 3 +1 ;

           }

          

           while( gap >0 ){

               forint i =gap ; i< n ; i ++){

                   j = i- gap ;

                   temp = data[ i ];

                    while( j >=0 && data[ j ]>temp ){

                        data [ j+ gap ] = data[ j ];

                        j = j- gap ;

                    }

                   data [ j+ gap ] = temp;

               }

              gap = ( gap -1 )/ 3;

              

              

           }

           print (data );

           end (start , "shell" );

      }

    * 堆排序

     public   void heapsort() {

           int data [] = create();

           print (data );

           long start = start ();

           crateheap (data );

           forint i =data . length- 1 ; i >= 1; i --){

               swap (i , 0, data );

               heapfiy (data , 0, i );

           }

           end (start , "堆" );

           print (data );

      }

     private void crateheap( int[] data ) {

           int n = data . length;

           forint i =n / 21 ; i > 0; i --){

               heapfiy (data , i, n );

           }

          

      }

     private void heapfiy( int[] data , int i, int n ) {

           int left = i * 21 ;

           int right = i * 22 ;

           int large = 0 ;

           if( left <n && data[ left ]>data [ i])

              large = left;

           else

              large = i;

           if( right <n && data[ right ]>data [ large])

              large = right;

           if( large !=i ){

               swap (large , i, data );

               heapfiy (data , large, n );

           }

      }

    * 归并排序

     public   void mergesort() {

           int data [] = create();

           print (data );

           long start = start ();

           merge (data , 0, data .length - 1);

           end (start , "归并" );

           print (data );

      }

     public void merge( int data [],int low ,int high){

           int mid = ( low+ high )/2 ;

           if( low <high ){

           merge (data , low, mid );

           merge (data , mid+ 1 , high );

           merge1 (data , low, mid , high );

           }

      }

     private void merge1( int[] data , int low, int mid , int high ) {

           int temp [] = new int [ high -low + 1];

           int i = low ;

           int j = mid + 1;

           int k = 0 ;

           while( i <=mid && j<= high ){

               if( data [i ]< data[ j ]){

                   temp [ k++] = data [ i++];

               }else {

                   temp [ k++] = data [ j++];

               }

           }

          

           while( i <=mid ){

              temp [ k++] = data [ i++];

           }

           while( j <=high ){

              temp [ k++] = data [ j++];

           }

          

           forint k2 =0 ; k2< temp .length ; k2++){

              data [ k2+ low ] = temp[ k2 ];

           }

          

      }

    * 二叉树排序

public class BinaryTree {

      int data ;       //根节点数据

      BinaryTree left ;    //左子树

      BinaryTree right ;   //右子树

      public BinaryTree( int data)     //实例化二叉树类

      {

       this. data = data ;

       left = null;

       right = null;

      }

      public void insert( BinaryTree root, int data ){     //向二叉树中插入子节点

            if( data >root . data)                                //二叉树的左节点都比根节点小

            {

             if( root .right ==null ){

              root . right = new BinaryTree( data );

             }else {

              this. insert (root . right, data );

             }

            }else {                                          //二叉树的右节点都比根节点大

             if( root .left ==null ){

              root . left = new BinaryTree( data );

             }else {

              this. insert (root . left, data );

             }

            }

           }

     

}

  public static void inOrder( BinaryTree root ){     

            if( root !=null){

             inOrder (root . left);

             System . out. print (root . data+ "--" );

             inOrder (root . right);

            }

           }

    * 快速排序

     public void quicksort() {

           int data [] = create();

           print (data );

           long start = start ();

           quick1 (data , 0, data .length - 1);

           end (start , "快速" );

           print (data );

      }

     public int [] quick1 (int data [],int left, int right ){

           int mid ;

           if( left <right ){

              mid = quick ( data, left , right );

               quick1 (data , left, mid -1 );

               quick1 (data , mid+ 1 , right );

           }

           return data;

      }

     private int quick( int[] data , int left, int right ) {

           int mid = data [ left];

           while( left <right ){

               while( left <right && data[ right ]>=mid )

                   right --;

              data [ left] = data [ right];

              

               while( left <right && data[ left ]<=mid )

                   left ++;

              data [ right] = data [ left];

           }

          

          data [ left] = mid ;

          

           return left;

      }

时间: 2024-08-01 06:36:19

java实现 数据结构之8大排序的相关文章

【软考】数据结构之5大排序(一)

排序,是将一组随意排列的数据元素又一次排列成一个按键值有序的序列的过程,一般以键值的比較和记录移动为标准操作.排序是程序设计的基础.它往往是为检索服务的.一个优秀的算法离不开切实情景的排序方法. 1.分类: 排序有两种: 内部排序(InternalSorting):待排序的记录所有存放在计算机内存中进行排序的过程 外部排序(ExternalSorting):指待排序记录的数量非常大.以至于内存不能容纳所有记录.在排序过程中尚需外存进行訪问的排序过程 我们通常所说的5大排序,是编程者运用到程序中的

【菜鸟入门】数据结构之5大排序

排序,是将一组任意排列的数据元素重新排列成一个按键值有序的序列的过程,一般以键值的比较和记录移动为标准操作.它是程序设计的基础,一个优秀的算法离不开切实情景的排序方法. 分类: 排序有两种: 内部排序(InternalSorting):待排序的记录全部存放在计算机内存中进行排序的过程 外部排序(ExternalSorting):指待排序记录的数量很大,以至于内存不能容纳全部记录,在排序过程中尚需外存进行访问的排序过程 我们通常所说的5大排序,是编程者运用到程序中的排序方法,一般也被认为是内部排序

【Java学习笔记之十一】Java中常用的8大排序算法详解总结

分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序.   // 排序原始数据 private static final int[] NUMBERS = {49, 38, 65, 97, 76, 13, 27, 78, 34, 12, 64, 5, 4, 62, 99, 98,

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

Java数据结构与算法之排序

排序从大体上来讲,做了两件事情: 1.比较两个数据项: 2.交换两个数据项,或复制其中一项 一.冒泡排序 大O表示法:交换次数和比较次数都为O(N*N). 算法原理: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所有的元素重复以上的步骤,除了最后一个. 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. /** * 冒泡排序 demo * */

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

Java 8大排序算法

直接插入排序 //直接插入排序 public int[] insertSort(int[] a) { for (int i = 1; i < a.length; i++) { int j = i - 1; for (; j >= 0 && a[j] > a[i]; j--) { a[j + 1] = a[j];//往后移 } a[j + 1] = a[i]; } return a; } 希尔排序 //希尔排序 public int[] shellSort(int[] a)

Java 常用排序算法/程序员必须掌握的 8大排序算法

Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n 个数插到前

Java程序员必知的8大排序

8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. (2)实例 (3)用java实现 package com.njue; public class insertSort { public insertSort(){ inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99