排序算法一共有8种,这里介绍插入排序算法,该算法复杂度最好为O(n),最坏情况为O(n^2)。
当数组为大数组时,比如80000,数组排序时间为2秒,当然这主要依赖于你的电脑cpu配置。
代码关键:使用移位法找到插入位置。不能使用交换的方式。
package com.bruce.sorting;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class InsertSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
//int [] arr = {101,34,119,1};
int [] arr = new int[80000];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 800000); //生成一个[0,8000000)的数
}
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date1String = simpleDateFormat.format(date);
System.out.println("排序前的时间:" + date1String);
insertSort(arr);
Date date1 = new Date();
String date2String = simpleDateFormat.format(date1);
System.out.println("排序后的时间:" + date2String);
}
public static void insertSort(int[] arr){
//int [] arr = {101,34,119,1};
int insertValue = 0;
int insertIndex = 0; //即arr[1]的前面这个数的下标
//第一轮
//给insertValue找到一个插入的位置
//1.insertIndex >= 0保证在给insertValue找插入位置的时候,数组不越界
//2.insertValue < arr[insertIndex]说明待插入的数,没有找到适当的插入位置
//3.就需要将arr[insertIndex]后移
//定义待插入的数
// int insertValue = arr[1];
// int insertIndex = 1-1; //即arr[1]的前面这个数的下标
// while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
// //进入while,说明位置没找到
// arr[insertIndex + 1] = arr[insertIndex];
// insertIndex--;
// }
// //当退出while循环时,说明插入的位置找到,insertIndex + 1
// //举例:理解不了的话,通过debug去理解
// arr[insertIndex + 1] = insertValue;
//
// System.out.println("第一轮插入后,数组变成:");
// System.out.println(Arrays.toString(arr));
//第二轮
//给insertValue找到一个插入的位置
//1.insertIndex >= 0保证在给insertValue找插入位置的时候,数组不越界
//2.insertValue < arr[insertIndex]说明待插入的数,没有找到适当的插入位置
//3.就需要将arr[insertIndex]后移
//定义待插入的数
// insertValue = arr[2];
// insertIndex = 2-1; //即arr[2]的前面这个数的下标
// while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
// //进入while,说明位置没找到
// arr[insertIndex + 1] = arr[insertIndex];
// insertIndex--;
// }
// //当退出while循环时,说明插入的位置找到,insertIndex + 1
// //举例:理解不了的话,通过debug去理解
// arr[insertIndex + 1] = insertValue;
//
// System.out.println("第二轮插入后,数组变成:");
// System.out.println(Arrays.toString(arr));
//第三轮
//给insertValue找到一个插入的位置
//1.insertIndex >= 0保证在给insertValue找插入位置的时候,数组不越界
//2.insertValue < arr[insertIndex]说明待插入的数,没有找到适当的插入位置
//3.就需要将arr[insertIndex]后移
//定义待插入的数
// insertValue = arr[3];
// insertIndex = 3-1; //即arr[3]的前面这个数的下标
// while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
// //进入while,说明位置没找到
// arr[insertIndex + 1] = arr[insertIndex];
// insertIndex--;
// }
// //当退出while循环时,说明插入的位置找到,insertIndex + 1
// //举例:理解不了的话,通过debug去理解
// arr[insertIndex + 1] = insertValue;
//
// System.out.println("第二轮插入后,数组变成:");
// System.out.println(Arrays.toString(arr));
//时间复杂度 O(n^2)
for (int i = 1; i < arr.length; i++) {
insertValue = arr[i];
insertIndex = i-1; //即arr[1]的前面这个数的下标
while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
//进入while,说明位置没找到, 那么把arr[insertIndex]右移一位,如果还找不到,那么继续右移
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
//当退出while循环时,说明插入的位置找到,insertIndex + 1
//为什么是insertIndex + 1? 因为如果找到arr[0],仍然找不到,那么说明insertValue是最小的,需要排在第一个位置,但此时insertIndex == -1
//举例:理解不了的话,通过debug去理解
//判断是否需要赋值
if (insertIndex + 1 != i) {
arr[insertIndex + 1] = insertValue;
}
// System.out.println("第" + i + "轮插入后,数组变成:");
// System.out.println(Arrays.toString(arr));
}
}
}