几种常见的内部排序——面试必备

插入式排序

//插入式排序:有插入排序法;谢耳排序法;二叉树排序法

public class插入式排序 {

    public static void main(String[] args) {

        int arr[]={5,4,2,12,6,5};

        InsertSort.sort(arr);

        for(int i=0;i<arr.length;i++){

            System.out.print(arr[i]+" ");

        }

    }

}

class InsertSort{

    //插入排序法

    static void sort(int arr[]){

        for(int i=1;i<arr.length;i++){

            int insertVal=arr[i];

            //insertVal准备和前一个数比较

            int index=i-1;

            while(index>=0&&insertVal<arr[index]){

                //arr[index]向后移动

                arr[index+1]=arr[index];

                //index向前移动

                index--;

            }

            //insertVal插入到适当位置

            arr[index+1]=insertVal;

        }

    }

}

  

交换式排序

//内部排序:在内存中完成排序

//外部排序:数据量大,要借助外部进行排序

//交换式排序:有冒泡排序法;快速排序法

public class交换式排序 {

    public static void main(String[] args) {

        int arr[]={1,2,-11,5,4};

        //冒泡排序

//        int temp=0;

//        //外层循环:决定运行几次(个数减1次)

//        for(int i=0;i<arr.length-1;i++){

//            //内层循环:逐个比较,如果前一个数比后一个数大,则交换

//            //因为每次都会少一个数比较,所以-i

//            for(int j=0;j<arr.length-1-i;j++){

//                //大于号由小到大,小于号由大到小

//                if(arr[j]>arr[j+1]){

//                    temp=arr[j];

//                    arr[j]=arr[j+1];

//                    arr[j+1]=temp;

//                }

//            }

//        }

        

        //快速排序

        Quick.test(0,arr.length-1,arr);

        for(int i=0;i<arr.length;i++){

            System.out.print(arr[i]+" ");

        }

    }

}

class Quick{

    //快速排序法:抽一个数,把小的放左边,大的放右边,左右的数以此类推

    //速度越快,方法越难 =.=

    static void test(int left,int right,int[] array){

        int l=left;

        int r=right;

        //中间变量

        int pivot=array[(left+right)/2];

        int temp=0;    

        while(l<r){

            while(array[l]<pivot){

                l++;

            }

            while(array[r]>pivot){

                r--;

            }

            if(l>=r){

                break;

            }

            temp=array[l];

            array[l]=array[r];

            array[r]=temp;    

            if(array[l]==pivot){

                --r;

            }

            if(array[r]==pivot){

                ++l;

            }

        }

        if(l==r){

            l++;

            r--;

        }

        if(left<r){

            test(left,r,array);

        }

        if(right>l){

            test(l,right,array);

        }

    }

}

选择式排序

import java.util.Calendar;

//选择式排序:有选择排序法;堆排序法

public class选择式排序 {

    public static void main(String[] args) {

        //int arr[]={18,5,6,12,1,9};    

        int temp=0;

        //产生一个1~10000的随机数

        int len=100000;

        int[] arr=new int[len];

        for(int i=0;i<len;i++){

            //Math.random()会产生一个0~1的数

            int t=(int)(Math.random()*10000);

            arr[i]=t;

        }

        //在排序前打印时间,Calendar:日历

        Calendar cal=Calendar.getInstance();

        System.out.println("排序前:"+cal.getTime());

        //选择排序:比冒泡排序快

        for(int j=0;j<arr.length-1;j++){

            //认为第一个数就是最小

            int min=arr[j];

            //记录最小数下标

            int minIndex=j;    

            for(int k=j+1;k<arr.length;k++){

                if(min>arr[k]){

                    min=arr[k];

                    minIndex=k;

                }

            }

            //当退出循环,找到最小值

            temp=arr[j];

            arr[j]=arr[minIndex];

            arr[minIndex]=temp;

        }

        //Calendar(单态);重新得到时间

        cal=Calendar.getInstance();

        System.out.println("排序后:"+cal.getTime());

        //循环输出,输出耗时大

        /*for(int i=0;i<arr.length;i++){

            System.out.print(arr[i]+" ");

        }*/

    }

}

猜你喜欢

转载自www.cnblogs.com/xdzy/p/9467180.html