第七种排序算法:希尔排序
/**
* 插入排序
* 希尔排序:
* 基本思想:(分组再排序)
* 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。
* 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
* 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
* 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
* 先取一个正整数d1 < n, 把所有相隔d1的记录放一组,每个组内进行直接插入排序;
* 然后d2 < d1,重复上述分组和排序操作;直至di = 1,即所有记录放进一个组中排序为止。
*
* 时间复杂度:O(n1.3)
*
* 稳定性:不稳定
*
*/
希尔排序示例代码如下:
/**
* 插入排序
* 希尔排序:
* 基本思想:(分组再排序)
* 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。
* 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
* 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
* 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
* 先取一个正整数d1 < n, 把所有相隔d1的记录放一组,每个组内进行直接插入排序;
* 然后d2 < d1,重复上述分组和排序操作;直至di = 1,即所有记录放进一个组中排序为止。
*
* 时间复杂度:O(n1.3)
*
* 稳定性:不稳定
*
*/
public class SheelSort {
public static void main(String[] args) {
int arr[] = {1,4,6,8,2,5,3,7,9};
System.out.println("数组排序前顺序:");
for(int n : arr){
System.out.print(n+" ");
}
//希尔排序
sheelSort(arr);
System.out.println("\n数组排序后顺序:");
for(int n : arr){
System.out.print(n+" ");
}
}
//希尔排序
private static void sheelSort(int[] arr){
int i;
int j;
int temp;
int gap = 1;
int len = arr.length;
while(gap < len/3) {
gap = gap*3+1;
}
for(;gap>0;gap/=3) {
for(i=gap;i<len;i++) {
temp = arr[i];
for(j=i-gap;j>=0 && arr[j]>temp;j-=gap) {
arr[j+gap] = arr[j];
}
arr[j+gap] = temp;
}
}
}
}