记录自己学习插入排序和希尔排序的过程督促自己养成输出内容的习惯!!!
下面是两种基础的排序算法,本质上都是比较和交换 关键在于思想
(1):插入排序
public static void sort2(int[] arr){
// i 定位要插入的元素
int tmp;
for(int i=1;i<arr.length;i++){
for(int j = i ;j > 0 ;j--){
if(arr[j ] < arr[j - 1]){
Util.swap(arr,j,j-1);
}
}
}
}
插入排序思想很简单,利用两个for循环,外层 i 来定位需要排序的元素所以内层 j 用来指定比较的元素
1:i从1开始取值 也就是默认第一个元素有序
2:内层的 比较直接用 j 和 j - 1不要和外层 i 产生关系
(2):希尔排序
public static void sort(int[] arr){
int N = arr.length;
int h = 1;
while(h < N/3){
h = 3*h + 1;
}
/*
先将数据变成 h 有序
然后最后进行一次 插入排序
*/
while(h >= 1){
for(int i = h;i < N;i = i + h){
for(int j = i;j >= h;j = j-h){
if(arr[j-h] > arr[j]){
Util.swap(arr,j-h,j);
}
}
}
h = h /3;
}
}
说明:
思想: 当数据量比较大的时候,插入排序比较慢,因为如果最小的元素在数组最后需要跟前面每一个元素进行比较和交换会很耗时希尔排序的思想就是先将数组变成h 有序也就是不再是相邻的元素进行比较交换,而是跳着来间隔h 的距离来进行交换比较。
说明:
1: h 的选择 递增序列的选择 实际应用中 h = N/3的取值是够用的
2:希尔排序性能在中小型数据量上是可以接受的,并且跟后面介绍的O(nlogn)的高级排序算法性能不会相差两倍(算法书籍上是这么吹的)