java实现 冒泡排序 插入排序 选择排序

时间:2022-06-17 15:56:36

package test.sort;

public class TestSort {

    /**
     * 冒泡排序(升序)
     * 思想:将要排序的元素看做是竖着的排序的气泡,较小的元素比较轻,从而要往上符。在冒泡排序算法中我们要
     * 对这个气泡序列处理若干遍,所谓一遍处理,就是自底向上检查一遍这个序列。并时刻注意两个相邻的元素的顺序
     * 是否正确,如果发现两个相邻元素的顺序不对,即轻的元素子下面,就交互他们的位置,显然,处理一遍之后,最轻
     * 的元素就浮到最高位置,处理二遍之后,次轻的元素就浮到次高位置,在做第二编处理时,由于最高位置的元素已是
     * 最轻的元素,所以不必检查,一般地,第i编处理时,不必检查第i高位置以上的元素,应为前面i-1编的处理,他们
     * 正确的排好序。
     * @param src 待排序数组
     */
    private static void toBubbleSortAsc(int[] src){       
        long start = System.currentTimeMillis();
        for(int k=0;k<1000000;k++){
            for(int i=0;i<src.length;i++){
                for(int j=i+1;j<src.length;j++){
                    int temp;
                    if(src[i]>src[j]){
                        temp=src[j];
                        src[j]=src[i];
                        src[i]=temp;                   
                    }
                }
            }
        }
        System.out.println("冒泡排序(升序)如下,耗时:"+ (System.currentTimeMillis() - start));
    }
    /**
     * 冒泡排序(降序)
     * @param src 待排序数组
     */
    private static void toBubbleSortDesc(int[] src){       
       
        long start = System.currentTimeMillis();
        for(int k=0;k<1000000;k++){
            for(int i=0;i<src.length;i++){
                for(int j=i+1;j<src.length;j++){
                    int temp;
                    if(src[i]<src[j]){
                        temp=src[j];
                        src[j]=src[i];
                        src[i]=temp;                   
                    }
                }
            }
        }
        System.out.println("冒泡排序(降序)如下,耗时:"+ (System.currentTimeMillis() - start));
    }
    /**
     * 选择排序
     * 思想:对待排序的记录序列进行n-1编处理,第1编处理是将L[1..n]中最小者与L[1]交互位置第2编处理是将
     * L[2..n]中最小者与L[2]交换位置,...,第i编处理是将L[i..n]中最小者与L[i]交互位置,这样,经过i编处理
     * 后,前i个记录的位置就已经按从小到大顺序排序好了。
     * 当然,实际操作时,也可以根据需要,通过从待排序的记录中选择最大这与其首记录交互位置,按降序排序处理
     * @param src 待排序数组
     */
    private static void doChooseSort(int[] src){
        long start = System.currentTimeMillis();
        for(int k=0;k<1000000;k++){
            int temp;
            for(int i=0;i<src.length;i++){
                temp=src[i];
                //最小数下标
                int smallLocation=i;
                for(int j=i+1;j<src.length;j++){
                    if(src[j]<temp){
                        //取出最小数
                        temp=src[j];
                        //最小数下标
                        smallLocation=j;
                    }
                }
                src[smallLocation]=src[i];
                src[i]=temp;
            }
        }
        System.out.println("选择排序如下,耗时:"+ (System.currentTimeMillis() - start));
    }
   
    /**
     * 插入排序 (while循环)
     * @param src 待排序数组
     */
    private static void doInsertSortWhile(int[] src){
        long start = System.currentTimeMillis();
        for(int k=0;k<1000000;k++){
            for(int i=1;i<src.length;i++){
                int temp = src[i];
                int j=i;
                while(src[j-1]>temp){
                    src[j]=src[j-1];
                    j--;
                    if (j<=0) break;
                }
                src[j]=temp;
            }
        }
        System.out.println("插入排序 (while循环)如下,耗时:"+ (System.currentTimeMillis() - start));
    }
    /**
     * 插入排序 (for循环)
     * @param src 待排序数组
     */
    private static void doInsertSortfor(int[] src){
        long start = System.currentTimeMillis();
        for(int k=0;k<1000000;k++){
            for(int i=1;i<src.length;i++){
                int temp=src[i];
                int j;
                for (j=1;j>0;j--){
                    if(src[j-1]>temp){
                        src[j]=src[j-1];
                    }else{
                        break;
                    }
                }
                src[j]=temp;
            }
        }
        System.out.println("插入排序 (for 循环)如下,耗时:"+ (System.currentTimeMillis() - start));
    }
   
    public static void main(String[] args){
        int[] src=new int[]{3,5,1,2,7,8,4};
       
        //冒泡排序(升序)
        TestSort.toBubbleSortAsc(src);       
        for(int i=0;i<src.length;i++){
            System.out.print(src[i]+" ");           
        }
        //冒泡排序(降序)
        System.out.println();
        TestSort.toBubbleSortDesc(src);       
        for(int i=0;i<src.length;i++){
            System.out.print(src[i]+" ");           
        }
        //选择排序
        System.out.println();
        TestSort.doChooseSort(src);       
        for(int i=0;i<src.length;i++){
            System.out.print(src[i]+" ");           
        }
        //插入排序 (while循环)
        System.out.println();
        TestSort.doInsertSortWhile(src);       
        for(int i=0;i<src.length;i++){
            System.out.print(src[i]+" ");           
        }
        //插入排序 (for循环)
        System.out.println();
        TestSort.doInsertSortfor(src);       
        for(int i=0;i<src.length;i++){
            System.out.print(src[i]+" ");           
        }
       
    }
}