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));
        }
    }
}
原文地址:https://www.cnblogs.com/ERFishing/p/11301753.html