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)); } } }