直接插入排序算法
一、学习资料:
二、排序过程及代码
package com.lxf.sort;
import java.util.Arrays;
import java.util.Random;
/**
* 直接排序算法
*/
public class DirectSort {
/*
* 直接排序
* 从第二位开始,每一位都和前面的一位比较,如果小于前一位,则和前一位交换位置,一直比到最后一位
* 例如有这么六个数(下面|左边是已排序,右边是未排序):7 3 1 6 2 5
* 第一次遍历:3 7| 1 6 2 5
* 第二次遍历:1 3 7| 6 2 5
* 第三次遍历:1 3 6 7| 2 5
* 第四次遍历:1 2 3 6 7| 5
* 第五次遍历:1 2 3 5 6 7| (完成)
* 100000位数字排序花费时间(三次测试):17234ms 17911ms 18653ms
* 平均值:17932ms
* @param nums
* @return
*/
public static int[] directSort1(int[] nums){
//循环整个数组
for (int i = 0; i < nums.length; i++) {
//将当前值与当前值之前的值比较,若小于之前的值则换位
for (int j = i-1; j >=0; j--) {
if(nums[j+1]<nums[j]){
int temp=nums[j+1];
nums[j+1]=nums[j];
nums[j]=temp;
}
}
}
return nums;
}
/*
* 直接排序优化
* 相对与比较一位交换一次位置,改为比这一位小的往后移,这一位最后插入
* 100000位数字排序花费时间(三次测试):12716ms 14275ms 13086ms
* 平均值:13359ms
* @param nums
* @return
*/
public static int[] directSort2(int[] nums){
//循环整个数组
for (int i = 0; i < nums.length; i++) {
//将当前值与当前值之前的值比较,若小于之前的值则前一位后移,最后当前值插入
for (int j = i-1; j >=0; j--) {
//获取当前值
int temp=nums[i];
//每一位与当前值比较
if(nums[j]<temp){
nums[j+1]=nums[j];
}
nums[j]=temp;
}
}
return nums;
}
public static void main(String[] args) {
//获取一个数字字符串
StringBuilder stringBuilder = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 100000; i++) {
stringBuilder.append(random.nextInt(500)+",");
}
//去掉最后一个,
stringBuilder.setLength(stringBuilder.length()-1);
//获取整数数组
String[] splits= stringBuilder.toString().split(",");
int[] nums = Arrays.stream(splits).mapToInt(Integer::valueOf).toArray();
//获取开始时间
long start = System.currentTimeMillis();
System.out.println("start = " + start);
//直接排序算法
int[] ints = directSort2(nums);
//获取执行完的时间
long end = System.currentTimeMillis();
System.out.println("end = " + end);
//计算执行时间
long sub=end-start;
System.out.println("花费时间="+sub);
}
}