简单直接插入排序以及其优化排序-shell排序
最近在复习数据结构部分内容,个人对直接插入排序的优化-shell排序产生了兴趣,用简单的操作就可以将时间复杂度减少十倍以上!
先写一个简单的直接插入排序了解一下。
1.直接插入排序
public class SortDemo {
/*
1.直接插入排序
思想:类似于接扑克牌
时间复杂度 O(n^2) 最好:O(n)
越有序越快
空间复杂度O(1)
稳定性:稳定(没有发生跳跃式交换)
*/
public static void insertSort(int[] array){
long start = System.currentTimeMillis();
for (int i = 1; i < array.length; i++) {
int temp = array[i];
int j = 0;
for ( j = i - 1 ; j >= 0 ; j--) {
if(array[temp] < array[j]){
array[j+1] = array[j];
}else{
break;
}
}
array[j+1] = temp;
}
long end = System.currentTimeMillis();
System.out.println("执行时间:"+(end - start));
}
主要思想:
类似于接扑克牌的过程。
第一个数默认有序,从第二个数开始,将数据放入temp临时存放,并且和前面的数array[j]进行比较。
1)array[j] > temp ,将array[j]中的数存放到array[j+1]里,再依次和左边的数比较,直到找到array[j] < temp或者j<0。退出
2)array[j] < temp,直接退出就好了。
最后把temp存放的值放在array[j+1]中即可。
2.对直接插入排序的优化 — shell排序
主要思想:
shell排序实际上就是将数据分成若干个组,对每一组进行直接插入排序。
这样做假设有100个数据,如果直接插入排序则时间复杂度最坏情况为100100 = 10000
而shell排序入股分成10组,每组10个数据,则时间复杂度最坏为1010*10 = 1000
直接把复杂度降低了十倍!
在分组的时候,采用如图分组方法,
这里将其分成5组,每隔5个数据的分在一组。具体实现如下:
/*
2.shell排序:对直接插入排序的优化
思想:将数据分组,组内进行直接插入排序
*/
public static void shell(int[] array,int gap){
//gap为分组后每个组的数据个数
for (int i = gap; i < array.length ; i++) {
int temp = array[i];
int j = 0;
for ( j = i - gap; j >= 0 ; j -= gap) {
if(array[j] > temp){
array[j+gap] = array[j];
}else{
break;
}
}
array[j+gap] = temp;
}
}
public static void shellSort(int[] array){
int[]arr ={5,3,1};
long startTime = System.currentTimeMillis();
for (int i = 0; i <arr.length ; i++) {
shell(array,arr[i]);
}
long endTime = System.currentTimeMillis();
System.out.println("shell排序处理时间为:"+(endTime - startTime));
}
```