排序(冒泡、桶排序、快速)(java)

每一个项目中基本都会用到排序,如成绩排名等等,可见排序的重要性,每一种排序方法都有自己的特点,在选择用哪一种排序的时候,要根据数据的多少以及效率、资源占用等问题考虑,排序有多种,比如冒泡排序、二分排序、快速排序、桶排序、堆排序等等,在这里主要给大家接受一下冒泡排序与桶排序以及快速排序。

冒泡排序

冒泡排序是比较典型的一个排序,大家在第一次接触排序时一般都是冒泡排序,冒泡排序的思想就是把大数或小数沉下去,从而完成排序。先给大家看一下源码

package sort;

public class maopao {

    public static void main(String[] args) {
        int []a=new int[10];                                      //给数组赋值,大家也可以通过Scanner从控制台输入要排序的数字
        int m;
        for(int i=0;i<10;i++) {
            a[i]=i;
        }
        for(int k=0;k<a.length;k++) {                                 //需要给多少个数排序
            for(int p=0;p<a.length-1;p++) {                         //每次需要比较多少次
                if(a[k]>=a[p]) {                                              //比较
                    m=a[k];
                    a[k]=a[p];                                                  //两个数互相交换
                    a[p]=m;
                }
            }
        }
        for (int i:a) {
            System.out.println(i);                                        //最后遍历数组,完成排序
        }
    }

}
 

冒泡排序的思想就是大数向下沉,或者小数往下沉,冒泡排序的时间复杂度为O(N²),时间复杂度较高,冒泡排序在数量较少时使用比较合适,当数量很大时,不建议使用冒泡排序,太浪费时间。
在这里插入图片描述
比如这几个数,先拿第一个数与第二个数比较,3<7,不需要交换,然后7与4比较,7>4交换位置
在这里插入图片描述
然后7与9进行比较,7<9,不需要交换;然后还剩几个数没比较,按照上边的方法试试看吧。
然后冒牌排序就先到这里。接下来介绍下一种。

桶排序

对于桶排序大家可能没有听说过,但桶排序有它自己的优点,比较好理解,让我们来了解一下桶排序吧。桶,可以理解成一个容器,桶排序顾名思义就是利用一些容器进行排序,它就是利用这一原理进行排序的,然后来看一下源码。

package sort;

import java.util.Scanner;

public class TSort {
    public static void main(String[] args) {
        System.out.println("请输入要排序的数量");
        Scanner sn=new Scanner(System.in);
        int number=sn.nextInt();
        System.out.println("请输入要排序中的最大数");
        int max=sn.nextInt();
        int []array=new int[max+1];
        for(int j=0;j<array.length;j++) {
            array[j]=0;                                                          //定义容器,也就是桶
        }
        System.out.println("请输入要排序的数");
        for(int i=0;i<number;i++) {
            int numbers=sn.nextInt();                                
            array[numbers]++;                                              //表示有numbers这个数放到了array[numbers]里,array[numbers]+1
        }
        sn.close();
        for(int j=0;j<array.length;j++) {
            for(int i=1;i<=array[j];i++) {                           //将有添加进来的数,按顺序输出出去
                System.out.println(j);                            
            }
        }

    }
    }
 

桶排序是准备一个连续的数组作为容器,若有数添加进来,则在定义的容器数组相应的地方自加一次,然后添加进来的数相应的数组上的数应该是>=1的,然后依次输出即可。这个方法的弊端已经明显了吧,就是当你要给一个特别大的数进行排序时,需要建立一个特别大的数组,并且还要浪费很多空间,所以当要排序的数很大时,不建议使用这一种方法

快速排序

快速排序大家可能听说过,这种方法用的也比较多,使用这种方法会用到递归这种思想,递归,就是写一个方法然后自己调用自己,设置一个退出条件,完成操作。老规矩,先看源码

package sort;

import java.util.Scanner;

public class QuikSort {
    public static void quickSort(int[] arrars,int left,int right){
            int i,j,temp,t;
            if(left>right){
                return;
            }
            i=left;
            j=right;
            //temp就是基准位
            temp = arrars[left];
     
            while (i<j) {
                //先看右边,依次往左递减
                while (temp<=arrars[j]&&i<j) {
                    j--;
                }
                //再看左边,依次往右递增
                while (temp>=arrars[i]&&i<j) {
                    i++;
                }
                //如果满足条件则交换
                if (i<j) {
                    t = arrars[j];
                    arrars[j] = arrars[i];
                    arrars[i] = t;
                }
     
            }
            //最后将基准为与i和j相等位置的数字交换
            arrars[left] = arrars[i];
            arrars[i] = temp;
            //递归调用左半数组
            quickSort(arrars, left, j-1);
            //递归调用右半数组
            quickSort(arrars, j+1, right);
        }
        public static void main(String[] args){
            int[] arrays = {10,7,2,4,7,62,3,4,2,1,8,9,19};
            quickSort(arrays, 0, arrays.length-1);
            for (int i = 0; i < arrays.length; i++) {
                System.out.println(arrays[i]);
            }
        }
    
//}
}
 

快速排序的思想是,把这些数放到数组中,先拿出一个数,一般拿第一个数,给这个数找到相应的位置,但是这个位置比较特别,要求比这个数小的数放到它的左边,比它大的数放到这个数的右边,由此需要设置一个左边和一个右边的数,退出条件就是左边的标号大于右边的标号,因为再比下去没有任何意义,浪费时间空间。

猜你喜欢

转载自www.cnblogs.com/jinlous/p/11725928.html