冒泡排序
冒泡排序是比较典型的一个排序,大家在第一次接触排序时一般都是冒泡排序,冒泡排序的思想就是把大数或小数沉下去,从而完成排序。先给大家看一下源码
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]); } } //} }
快速排序的思想是,把这些数放到数组中,先拿出一个数,一般拿第一个数,给这个数找到相应的位置,但是这个位置比较特别,要求比这个数小的数放到它的左边,比它大的数放到这个数的右边,由此需要设置一个左边和一个右边的数,退出条件就是左边的标号大于右边的标号,因为再比下去没有任何意义,浪费时间空间。