zoukankan      html  css  js  c++  java
  • D6-排序算法(二)[Java数据结构和算法]

    1.内部排序

      1.1 插入排序(Insert Sorting)

      (1)思想:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

      (2)源代码

    package cn.atguigu.sort;
    
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Date;
    
    public class SelectSort {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //int[] arr= {101,34,119,1};
            int[] arr=new int[16];
            for(int i=0;i<arr.length;i++) {
                arr[i]=(int)(Math.random()*80);
            }
            
            Date date1=new Date();
            SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String date1Str=simpleDateFormat.format(date1);
            System.out.println("排序前时间"+date1Str);
            
            
            selectSort(arr);
            Date date2=new Date();
            String date2Str=simpleDateFormat.format(date2);
            System.out.println("排序后时间"+date2Str);
            
            System.out.println(Arrays.toString(arr));
        }
        
        public static void selectSort(int[] arr) {
            
            int min=0;
            int minIndex=0;//最小值的下标
            boolean flag=false;
            for(int i=0;i<arr.length;i++) {
                min=arr[i];//假设本身为最小值
                flag=false;
                for(int j=i+1;j<arr.length;j++) {
                    if(min>arr[j]) {
                        min=arr[j];//找出a[i+1]-a[n-1]之间的最小值,记住其最小值的下标
                        minIndex=j;
                        flag=true;
                    }
                }
                if(flag) {
                    //进行交换
                    arr[minIndex]=arr[i];
                    arr[i]=min;                
                }
            }
        }
    
    }

       (3)存在问题分析:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。

      1.2 希尔排序:对插入排序进行改进优化,又称缩小增量排序

      (1)思想:把记录按小表的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法终止。

           

      (2)源代码

    package cn.atguigu.sort;
    
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Date;
    
    public class ShellSort {
        public static void main(String[] args) {
    //        int[] arr = { 8, 9, 1, 0 };
    
            int[] arr = new int[80000];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = (int) (Math.random() * 8000);
            }
    //        ShellSort(arr);
    
            
              Date date1 = new Date(); SimpleDateFormat simpleDateFormat = new
              SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date1Str =
              simpleDateFormat.format(date1); System.out.println("排序前时间" + date1Str);
              ShellSort1(arr);
              
              Date date2 = new Date(); String date2Str = simpleDateFormat.format(date2);
              System.out.println("排序后时间" + date2Str);
             
    
    //        System.out.println(Arrays.toString(arr));
        }
        //交换法实现希尔排序
        public static void ShellSort(int[] arr) {
            int temp = 0;
            int count = 0;
            int step = arr.length / 2;
            while (step > 0) {
                for (int i = step; i < arr.length; i++) {
                    // 遍历各组中的所有元素(共arr.length/2组,每组2个元素),步长arr.length/2
                    for (int j = i - step; j >= 0; j -= step) {
                        // 如果当前元素大于加上步长后的那个元素,说明交换
                        if (arr[j] > arr[j + step]) {
                            temp = arr[j];
                            arr[j] = arr[j + step];
                            arr[j + step] = temp;
                        }
                    }
                }
                step /= 2;
    //            System.out.println("希尔排序第" + (++count) + "轮=" + Arrays.toString(arr));
            }
        }
        //移动法实现希尔排序,实现优化
        public static void ShellSort1(int[] arr) {
            int step = arr.length / 2;
            while (step > 0) {
                // 从第step个元素,逐个对其所在的组进行插入排序
                for (int i = step; i < arr.length; i++) {
                    int j=i;
                    int temp=arr[j];
                    if (arr[j] < arr[j - step]) {
                        while(j-step>=0&&temp<arr[j-step]) {
                            //移动
                            arr[j]=arr[j-step];
                            j-=step;
                        }
                    //当退出while后,就给temp找到插入的位置
                        arr[j]=temp;
                    }
                }
                step /= 2;
    //            System.out.println("希尔排序第" + (++count) + "轮=" + Arrays.toString(arr));
            }
        }
    }
  • 相关阅读:
    案例19-页面使用ajax显示类别菜单
    案例18-首页最新商品和热门商品显示
    案例17-validate自定义校验规则校验验证码是否输入正确
    案例16-validate自定义校验规则校验用户名是否存在
    案例15-基本的表单校验使用validate
    测开之路六十九:监控平台之视图层
    测开之路六十八:监控平台之监控逻辑和处理逻辑
    测开之路六十七:监控平台之附加功能准备
    测开之路六十六:UI测试平台之处理逻辑和蓝图添加到程序入口
    测开之路六十五:UI测试平台之js
  • 原文地址:https://www.cnblogs.com/ERFishing/p/11301753.html
Copyright © 2011-2022 走看看