Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 352|回复: 0

[默认分类] Java实现几种常见排序方法

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-7 12:24:22 | 显示全部楼层 |阅读模式
    日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。
    冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。



    代码

      
       
       /**
         
    * 冒泡法排序<br/>  

    * <li>比较相邻的元素。如果第一个比第二个大,就交换他们两个。</li>  
    * <li>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。</li>  
    * <li>针对所有的元素重复以上的步骤,除了最后一个。</li>  
    * <li>持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。</li>  

    *   
    *
       @param
        numbers  
    *            需要排序的整型数组  

       */
         

       public
       
       static
       
       void
        bubbleSort(
       int
       [] numbers) {   
       
       int
        temp;
       //
        记录临时中间值   
       

          
       int
        size
       =
        numbers.length;
       //
        数组大小   
       

          
       for
        (
       int
        i
       =
       
       0
       ; i
       <
        size
       -
       
       1
       ; i
       ++
       ) {   
            
       for
        (
       int
        j
       =
        i
       +
       
       1
       ; j
       <
        size; j
       ++
       ) {   
                
       if
        (numbers
       <
        numbers[j]) {
       //
        交换两数的位置   
       

                       temp
       =
        numbers;   
                    numbers
       =
        numbers[j];   
                    numbers[j]
       =
        temp;   
                }   
            }   
        }   
    }  

      




    快速排序使用分治法策略来把一个序列分为两个子序列。




    代码

      
       
       /**
         
    * 快速排序<br/>  
    * <ul>  
    * <li>从数列中挑出一个元素,称为“基准”</li>  
    * <li>重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,  
    * 该基准是它的最后位置。这个称为分割(partition)操作。</li>  
    * <li>递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。</li>  
    * </ul>  
    *   
    *
       @param
        numbers  
    *
       @param
        start  
    *
       @param
        end  

       */
         

       public
       
       static
       
       void
        quickSort(
       int
       [] numbers,
       int
        start,
       int
        end) {   
       
       if
        (start
       <
        end) {   
            
       int
        base
       =
        numbers[start];
       //
        选定的基准值(第一个数值作为基准值)   
       

               
       int
        temp;
       //
        记录临时中间值   
       

               
       int
        i
       =
        start, j
       =
        end;   
            
       do
        {   
                
       while
        ((numbers
       <
        base)
       &&
        (i
       <
        end))   
                    i
       ++
       ;   
                
       while
        ((numbers[j]
       >
        base)
       &&
        (j
       >
        start))   
                    j
       --
       ;   
                
       if
        (i
       <=
        j) {   
                    temp
       =
        numbers;   
                    numbers
       =
        numbers[j];   
                    numbers[j]
       =
        temp;   
                    i
       ++
       ;   
                    j
       --
       ;   
                }   
            }
       while
        (i
       <=
        j);   
            
       if
        (start
       <
        j)   
                quickSort(numbers, start, j);   
            
       if
        (end
       >
        i)   
                quickSort(numbers, i, end);   
        }   
    }  

      




    选择排序是一种简单直观的排序方法,每次寻找序列中的最小值,然后放在最末尾的位置。




    代码

      
       
       /**
         
    * 选择排序<br/>  
    * <li>在未排序序列中找到最小元素,存放到排序序列的起始位置</li>  
    * <li>再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。</li>  
    * <li>以此类推,直到所有元素均排序完毕。</li>  

    *   
    *
       @param
        numbers  

       */
         

       public
       
       static
       
       void
        selectSort(
       int
       [] numbers) {   
       
       int
        size
       =
        numbers.length, temp;   
       
       for
        (
       int
        i
       =
       
       0
       ; i
       <
        size; i
       ++
       ) {   
            
       int
        k
       =
        i;   
            
       for
        (
       int
        j
       =
        size
       -
       
       1
       ; j
       >
       i; j
       --
       )  {   
                
       if
        (numbers[j]
       <
        numbers[k])  k
       =
        j;   
            }   
            temp
       =
        numbers;   
            numbers
       =
        numbers[k];   
            numbers[k]
       =
        temp;   
        }   
    }  


      




    插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。其具体步骤参见代码及注释。




    代码

      
       
       /**
         
    * 插入排序<br/>  
    * <ul>  
    * <li>从第一个元素开始,该元素可以认为已经被排序</li>  
    * <li>取出下一个元素,在已经排序的元素序列中从后向前扫描</li>  
    * <li>如果该元素(已排序)大于新元素,将该元素移到下一位置</li>  
    * <li>重复步骤3,直到找到已排序的元素小于或者等于新元素的位置</li>  
    * <li>将新元素插入到该位置中</li>  
    * <li>重复步骤2</li>  
    * </ul>  
    *   
    *
       @param
        numbers  

       */
         

       public
       
       static
       
       void
        insertSort(
       int
       [] numbers) {   
       
       int
        size
       =
        numbers.length, temp, j;   
       
       for
       (
       int
        i
       =
       1
       ; i
       <
       size; i
       ++
       ) {   
            temp
       =
        numbers;   
            
       for
       (j
       =
        i; j
       >
       
       0
       
       &&
        temp
       <
        numbers[j
       -
       1
       ]; j
       --
       )   
                numbers[j]
       =
        numbers[j
       -
       1
       ];   
            numbers[j]
       =
        temp;   
        }   
    }  

      




    归并排序是建立在归并操作上的一种有效的排序算法,归并是指将两个已经排序的序列合并成一个序列的操作。参考代码如下:




    代码

      
       
       /**
         
    * 归并排序<br/>  
    * <ul>  
    * <li>申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列</li>  
    * <li>设定两个指针,最初位置分别为两个已经排序序列的起始位置</li>  
    * <li>比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置</li>  
    * <li>重复步骤3直到某一指针达到序列尾</li>  
    * <li>将另一序列剩下的所有元素直接复制到合并序列尾</li>  
    * </ul>  
    *   
    *
       @param
        numbers  

       */
         

       public
       
       static
       
       void
        mergeSort(
       int
       [] numbers,
       int
        left,
       int
        right) {   
       
       int
        t
       =
       
       1
       ;
       //
        每组元素个数   
       

          
       int
        size
       =
        right
       -
        left
       +
       
       1
       ;   
       
       while
        (t
       <
        size) {   
            
       int
        s
       =
        t;
       //
        本次循环每组元素个数   
       

               t
       =
       
       2
       
       *
        s;   
            
       int
        i
       =
        left;   
            
       while
        (i
       +
        (t
       -
       
       1
       )
       <
        size) {   
                merge(numbers, i, i
       +
        (s
       -
       
       1
       ), i
       +
        (t
       -
       
       1
       ));   
                i
       +=
        t;   
            }   
            
       if
        (i
       +
        (s
       -
       
       1
       )
       <
        right)   
                merge(numbers, i, i
       +
        (s
       -
       
       1
       ), right);   
        }   
    }   

       /**
         
    * 归并算法实现  
    *   
    *
       @param
        data  
    *
       @param
        p  
    *
       @param
        q  
    *
       @param
        r  

       */
         

       private
       
       static
       
       void
        merge(
       int
       [] data,
       int
        p,
       int
        q,
       int
        r) {   
       
       int
       [] B
       =
       
       new
       
       int
       [data.length];   
       
       int
        s
       =
        p;   
       
       int
        t
       =
        q
       +
       
       1
       ;   
       
       int
        k
       =
        p;   
       
       while
        (s
       <=
        q
       &&
        t
       <=
        r) {   
            
       if
        (data
       <=
        data[t]) {   
                B[k]
       =
        data;   
                s
       ++
       ;   
            }
       else
        {   
                B[k]
       =
        data[t];   
                t
       ++
       ;   
            }   
            k
       ++
       ;   
        }   
       
       if
        (s
       ==
        q
       +
       
       1
       )   
            B[k
       ++
       ]
       =
        data[t
       ++
       ];   
       
       else
         
            B[k
       ++
       ]
       =
        data[s
       ++
       ];   
       
       for
        (
       int
        i
       =
        p; i
       <=
        r; i
       ++
       )   
            data
       =
        B;   
    }  

      




    将之前介绍的所有排序算法整理成NumberSort类,代码




    代码

      
       
       package
        test.sort;   

       import
        java.util.Random;   

       //
       Java实现的排序类  
       

       public
       
       class
        NumberSort {   
       
       //
       私有构造方法,禁止实例化  
       

          
       private
        NumberSort() {   
            
       super
       ();   
        }   
       
       //
       冒泡法排序
       

          
       public
       
       static
       
       void
        bubbleSort(
       int
       [] numbers) {   
            
       int
        temp;
       //
        记录临时中间值   
       

               
       int
        size
       =
        numbers.length;
       //
        数组大小   
       

               
       for
        (
       int
        i
       =
       
       0
       ; i
       <
        size
       -
       
       1
       ; i
       ++
       ) {   
                
       for
        (
       int
        j
       =
        i
       +
       
       1
       ; j
       <
        size; j
       ++
       ) {   
                   
       if
        (numbers
       <
        numbers[j]) {
       //
        交换两数的位置   
       

                           temp
       =
        numbers;   
                        numbers
       =
        numbers[j];   
                        numbers[j]
       =
        temp;   
                    }   
                }   
            }   
        }   
       
       //
       快速排序
       

          
       public
       
       static
       
       void
        quickSort(
       int
       [] numbers,
       int
        start,
       int
        end) {   
            
       if
        (start
       <
        end) {   
                
       int
        base
       =
        numbers[start];
       //
        选定的基准值(第一个数值作为基准值)   
       

                   
       int
        temp;
       //
        记录临时中间值   
       

                   
       int
        i
       =
        start, j
       =
        end;   
                
       do
        {   
                   
       while
        ((numbers
       <
        base)
       &&
        (i
       <
        end))   
                        i
       ++
       ;   
                   
       while
        ((numbers[j]
       >
        base)
       &&
        (j
       >
        start))   
                        j
       --
       ;   
                   
       if
        (i
       <=
        j) {   
                        temp
       =
        numbers;   
                        numbers
       =
        numbers[j];   
                        numbers[j]
       =
        temp;   
                        i
       ++
       ;   
                        j
       --
       ;   
                    }   
                }
       while
        (i
       <=
        j);   
                
       if
        (start
       <
        j)   
                    quickSort(numbers, start, j);   
                
       if
        (end
       >
        i)   
                    quickSort(numbers, i, end);   
            }   
        }   
       
       //
       选择排序
       

          
       public
       
       static
       
       void
        selectSort(
       int
       [] numbers) {   
            
       int
        size
       =
        numbers.length, temp;   
            
       for
        (
       int
        i
       =
       
       0
       ; i
       <
        size; i
       ++
       ) {   
                
       int
        k
       =
        i;   
                
       for
        (
       int
        j
       =
        size
       -
       
       1
       ; j
       >
        i; j
       --
       ) {   
                   
       if
        (numbers[j]
       <
        numbers[k])   
                        k
       =
        j;   
                }   
                temp
       =
        numbers;   
                numbers
       =
        numbers[k];   
                numbers[k]
       =
        temp;   
            }   
        }   
       
       //
       插入排序   
       
       //
        @param numbers  
       

          
       public
       
       static
       
       void
        insertSort(
       int
       [] numbers) {   
            
       int
        size
       =
        numbers.length, temp, j;   
            
       for
        (
       int
        i
       =
       
       1
       ; i
       <
        size; i
       ++
       ) {   
                temp
       =
        numbers;   
                
       for
        (j
       =
        i; j
       >
       
       0
       
       &&
        temp
       <
        numbers[j
       -
       
       1
       ]; j
       --
       )   
                    numbers[j]
       =
        numbers[j
       -
       
       1
       ];   
                numbers[j]
       =
        temp;   
            }   
        }   
       
       //
       归并排序  
       

          
       public
       
       static
       
       void
        mergeSort(
       int
       [] numbers,
       int
        left,
       int
        right) {   
            
       int
        t
       =
       
       1
       ;
       //
        每组元素个数   
       

               
       int
        size
       =
        right
       -
        left
       +
       
       1
       ;   
            
       while
        (t
       <
        size) {   
                
       int
        s
       =
        t;
       //
        本次循环每组元素个数   
       

                   t
       =
       
       2
       
       *
        s;   
                
       int
        i
       =
        left;   
                
       while
        (i
       +
        (t
       -
       
       1
       )
       <
        size) {   
                    merge(numbers, i, i
       +
        (s
       -
       
       1
       ), i
       +
        (t
       -
       
       1
       ));   
                    i
       +=
        t;   
                }   
                
       if
        (i
       +
        (s
       -
       
       1
       )
       <
        right)   
                    merge(numbers, i, i
       +
        (s
       -
       
       1
       ), right);   
            }   
        }   
       
       //
       归并算法实现  
       

          
       private
       
       static
       
       void
        merge(
       int
       [] data,
       int
        p,
       int
        q,
       int
        r) {   
            
       int
       [] B
       =
       
       new
       
       int
       [data.length];   
            
       int
        s
       =
        p;   
            
       int
        t
       =
        q
       +
       
       1
       ;   
            
       int
        k
       =
        p;   
            
       while
        (s
       <=
        q
       &&
        t
       <=
        r) {   
                
       if
        (data
       <=
        data[t]) {   
                    B[k]
       =
        data;   
                    s
       ++
       ;   
                }
       else
        {   
                    B[k]
       =
        data[t];   
                    t
       ++
       ;   
                }   
                k
       ++
       ;   
            }   
            
       if
        (s
       ==
        q
       +
       
       1
       )   
                B[k
       ++
       ]
       =
        data[t
       ++
       ];   
            
       else
         
                B[k
       ++
       ]
       =
        data[s
       ++
       ];   
            
       for
        (
       int
        i
       =
        p; i
       <=
        r; i
       ++
       )   
                data
       =
        B;   
        }   
      
    }  

      




    数字排序算法通常用来作为算法入门课程的基本内容,在实际应用(尤其是普通商业软件)中使用的频率较低,但是通过排序算法的实现,可以深入了解计算机语言的特点,可以以此作为学习各种编程语言的基础。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-24 01:38 , Processed in 0.401215 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表