每一个项目中基本都会用到排序,如成绩排名等等,可见排序的重要性,每一种排序方法都有自己的特点,在选择用哪一种排序的时候,要根据数据的多少以及效率、资源占用等问题考虑,排序有多种,比如冒泡排序、二分排序、快速排序、桶排序、堆排序等等,在这里主要给大家接受一下冒泡排序与桶排序以及快速排序。
冒泡排序
冒泡排序是比较典型的一个排序,大家在第一次接触排序时一般都是冒泡排序,冒泡排序的思想就是把大数或小数沉下去,从而完成排序。先给大家看一下源码
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]);
}
}
//}
}
快速排序的思想是,把这些数放到数组中,先拿出一个数,一般拿第一个数,给这个数找到相应的位置,但是这个位置比较特别,要求比这个数小的数放到它的左边,比它大的数放到这个数的右边,由此需要设置一个左边和一个右边的数,退出条件就是左边的标号大于右边的标号,因为再比下去没有任何意义,浪费时间空间