新手必看——JAVA排序详解(冒泡排序和插入排序)


对于排序,它一直不厌其烦的出现在企业面试初级工程师的笔试题中,不管是冒泡排序还是插入排序,我们经常会在在初级面试题中遇见,就好像它已成为一种面试的标准。而对于程序员来说,基本排序就真的这么重要吗?当然不,作为一个老司机的我们已经知道,对于新手很心累的各种这两种排序,其实只要一个简单的Arrays.sort()方法就可完成,也就是我们常说的快速排序,那为何还要对新手有这两种排序算法的要求?
首先,排序方法当然不止这两种,但是对于新手来说,冒泡和插入不止是一种算法,而是一种思想。也是对嵌套循环的一种运用,所以对于新手来说,排序就变成了一种必备的要求。

—– 冒泡排序 —–
冒泡排序的原理:将数组中的第1个数跟第2个数相比较,哪个数大,哪个存在后面。什么意思呢,如果arr[0]>arr[1],则将两个数调换位置(相信交换数值的例子大家都会做),如下:

    if(arr[0]>arr[1]){//这样就把两个数中较大的数存在了后面的位置
        int k=arr[0];
        arr[0]=arr[1];
        arr[1]=k;
    }

比较完以后,再拿第2个数与第3个数比较,再将较大的数存在后面的位置,直到比完最后一个数为止,经过这一轮比较你会发现,数组中的最后一个数就是最大数,如下:

    int [] arr=new int[]{15,20,36,12,45,9};
    for(int i=0;ilength-1;i++){
        if(arr[i]>arr[i+1]){
            int k=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=k;
        }
    }
    System.out.println(arr[arr.length-1]);//数组最后一个元素是最大值  45

这时候我们找到了数组的最大值并且经过交换把它存在了数组最后一个位置,我们只需要用同样的方法把剩余的数比较一遍(循环),然后再存在剩余位置的最后一个位置即可(每过一轮能找到一个剩余数中的最大数并存在剩余的最靠后位置),所以我们第二次比较只需要比较arr.length-1-1次,同样第三次只需要比较arr.length-1-2次,如下:

    int [] arr=new int[]{15,20,36,12,45,9};
    for(int j=0;jlength;j++){
        for(int i=0;ilength-1-j;i++){//每次循环冒出一个较大数,然后其余数再比较
            if(arr[i]>arr[i+1]){//交换元素
                int k=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=k;
            }
        }
    }
    System.out.println(arr[arr.length-1]);//数组最后一个元素是最大值  45
    System.out.println(Arrays.toString(arr));//[9, 12, 15, 20, 36, 45]

—– 插入排序 —–
插入排序原理:将数组中的每一个元素与第一个元素相比较!如果这个元素小于第一个元素,则交换这两个元素,然后循环这条规则。
如图:
新手必看——JAVA排序详解(冒泡排序和插入排序)_第1张图片
从图中可以看到,我们可以把过程理解为将从数组第二个数开始(先把这个数定为要插入的数)依次与前面的数相比较,如果后面的数小,则交换位置,直到换到不必它前面的数小为止(就将要插入的数付给最后依次比数的位置)

    int [] arrs=new int[]{5,2,4,6,1,3};
         for (int i=1; iint k=arrs[i];//取出待插入元素
                int j;//作为插入位置
                for (j=i-1; j>=0&&k//将这个数与它前面的数一一比较
                    arrs[j+1]=arrs[j];//若这个数小,则把它前面的数向后移动
                }
                arrs[j+1]=k;//最后找到插入位置,如上图,3跟6 5 4 2 最后插入到原来4的位置
            }
         System.out.println(Arrays.toString(arrs));
        }
不管是哪种排序方法,原理都是差不多,主要看思路和能不能掌握,毕竟以后写代码的话可能会碰到类似算法的问题,要学会举一反三。希望对你们有用~

你可能感兴趣的:(JavaSE杂记)