zoukankan      html  css  js  c++  java
  • 几种常见的内部排序(面试必备)

    插入式排序

    //插入式排序:有插入排序法;谢耳排序法;二叉树排序法
    
    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]+" ");
    
            }*/
    
        }
    
    }
  • 相关阅读:
    关于Design Complier/Library Compiler的跌坑(坑爹)记录
    博客暂时停更
    简单的Verilog测试模板结构
    存储器的设计/建模
    静态时序分析的三种分析模式(简述)
    Linux系统的基本使用
    Modelsim的使用——复杂的仿真
    Python-第三方库requests
    MySQL查询结果写入到文件总结
    MySQL创建函数报“ERROR 1418 ”错误,不能创建函数
  • 原文地址:https://www.cnblogs.com/xdzy/p/9467180.html
Copyright © 2011-2022 走看看