开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,[点击查看活动详情]
插入排序
insertionSort
工作原理
通过构造有序序列,对未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
特点
时间复杂度:O(n^2)
空间复杂度:S(1)
是稳定的。
代码
public class InsertionSort{
public static void main(String[] args){
int[] arr={9,1,8,2,7,3,6,4,5};
insertionSort(arr);
insertionSortUpper(arr);
System.out.println(Arrayds.toString(arr));
}
private static void insertionSortUpper(int[] arr){
int e=0;
int j=0;
for(int i =1;i<arr.length;i++){
e=arr[i];
for( j=i;j>0 && arr[j-1]>e;j--){
arr[j]=arr[j-1];
}
arr[j]=e;
}
}
//优化
private static void insertionSort(int[] arr){
for(int i =1;i<arr.length;i++){
for(int j=i;j>0 && arr[j-1]>arr[j];j--){
swap(arr,j,j-1);
}
}
}
private static void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
冒泡,选择,插入,虽然都是O(n^2)级别,但是插入更快一些。
数据的分布情况:
1,完全随机——Random random = new Random();int[] arr=new int[10000];arr[i]=random.nextInt(10000);return arr;
2,大致有序——arr[i]=i+random.nextInt(10);
3,方差小——arr[i]=100+random.nextInt(10);
public static int[] getSorted(){}
getTotalRandom();//获取完全随机的数组。不同对象。int[] arr1=getTotalRandom();
Arrays.copyOf(arr1,arr1.length);//复制
System.currentTimeMillis()//获取时间
希尔排序
shellsort
第一个突破O(n^2)的排序算法。
是插入排序的改进版,不同的是,他会优先比较距离较远的元素。
缩小增量排序。gap.
特点
时间复杂度:O(n^1.3)
空间复杂度:S(1)
是不稳定的。
代码
public class ShellSort{
public static void main(String[] args){
int[] arr={9,1,8,2,7,3,6,4,5};
shellSort(arr);
System.out.println(Arrayds.toString(arr));
}
private static void shellSort(int[] arr){
for(int gap=arr.length/2;gep>0;gap=gap/2){
for(int i=gap;i<arr.length;i++){
int j=i;
int e=arr[i];
while(j-gap>=0 && arr[j-gap]>e){
arr[j]=arr[j-gap];
j=j-gap;
}
arr[j]=e;
}
}
}
}
大致排序使用插入排序会比希尔排序快。因为前面的都已经排好了,该点的左边一切都比他小。希尔基本都要走一遍。方差小,完全随机,希尔更快些。