插入排序
插入排序法介绍**:**
插入式排序属于内部排序法,是对于欲排字的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
插入排序法思想**:**
把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素, 把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
下面先思路代码实现:
package sort;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class InsertSort {
public static void main(String[] args){
int[] arr = {101,34,119,1,-1,88};
insertSort(arr);
}
//插入排序方法
public static void insertSort(int[] arr) {
//第一次插入排序
System.out.println("第一次插入排序:");
int insertVal = arr[1];
int inserIndex = 1-1;
while(inserIndex >= 0 && insertVal < arr[inserIndex]){
arr[inserIndex+1] = arr[inserIndex];
inserIndex--;
}
arr[inserIndex + 1] = insertVal;
System.out.println(Arrays.toString(arr));
//第二次插入排序
System.out.println("第二次插入排序:");
insertVal = arr[2];
inserIndex = 2-1;
while(inserIndex >= 0 && insertVal < arr[inserIndex]){
arr[inserIndex+1] = arr[inserIndex];
inserIndex--;
}
arr[inserIndex + 1] = insertVal;
System.out.println(Arrays.toString(arr));
//第三次插入排序
System.out.println("第三次插入排序:");
insertVal = arr[3];
inserIndex = 3-1;
while(inserIndex >= 0 && insertVal < arr[inserIndex]){
arr[inserIndex+1] = arr[inserIndex];
inserIndex--;
}
arr[inserIndex + 1] = insertVal;
System.out.println(Arrays.toString(arr));
}
}
下面是正规代码:
package sort;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class InsertSort {
public static void main(String[] args){
int[] arr = {101,34,119,1,-1,88};
insertSort(arr);
System.out.println("排序结果:"+Arrays.toString(arr));
/*这里是80000个随机数得算法效率测试。
int []arr1 = new int[80000];
for (int i=0; i < 80000;i++){
arr1[i] = (int)(Math.random()* 8000000);
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1str = simpleDateFormat.format(date1);
System.out.println("排序前的时间="+date1str);
insertSort(arr1);
Date date2 = new Date();
String date2str = simpleDateFormat.format(date2);
System.out.println("排序后的时间="+date2str);*/
}
//插入方法
public static void insertSort(int[] arr) {
int insertVal = 0;//用来记录待插入数值
int inserIndex = 0;//用来记录有序数列得最后下标值
for (int i =1;i < arr.length; i ++ ){
insertVal = arr[i];
inserIndex = i-1;
while(inserIndex >= 0 && insertVal < arr[inserIndex]){
arr[inserIndex+1] = arr[inserIndex];
inserIndex--;
}
if (inserIndex + 1 !=i){
//这里是一个优化,当待插入得这个数,位置不动时,不进行这一步。
arr[inserIndex + 1] = insertVal;
}
/*这里可以显示每一次插入排序后得结果,不理解得可以取消注释,帮助理解。
System.out.println("第"+i+"轮插入后结果:");
System.out.println(Arrays.toString(arr));*/
}
}
}