今天复习希尔排序,代码如下:
package com.sort;
import java.util.Random;
/**
* Shell排序:
* 1.思路:根据插入排序的特性分析,如果待排序的数据是有序的,那么最好的时间复杂度为O(n)
* 2.描述:对于一个长度为n的序列,设排列次数k,间距d=n/(2^k);则对于第k次排列,对i+d,i+2d,..,i+td进行插入排序(0<t<=2^k 0<i<d),
* 当d小于1的时候停止
* @author lingrp
*
*/
public class ShellSort {
public static int LENGTH=12;
public static void main(String[] args) {
int[] arr=new int[LENGTH];
initArr(arr);
displayArr(arr);
shellSort(arr);
displayArr(arr);
}
/**
*
* @param arr
*/
public static void shellSort(int[] arr) {
int size = arr.length;
int k = 1;
int d = size;
while(d>=1)
{
d = (int) (size / Math.pow(2, k));
for (int i = 0; i < d; i++) //遍历所有的子序列
{
for (int j = i+d; j < size ; j+=d) //对每一个子序列执行直接插入
{
int temp = arr[j];
while(j > 0 && temp < arr[j-1])
{
arr[j] = arr[j-1];
j--;
}
arr[j] = temp;
}
}
k++;
}
}
/**
* 遍历数组
* @param arr
*/
public static void displayArr(int[] arr) {
for (int i : arr) {
System.out.print(i+" ");
}
System.out.println();
}
/**
* 通过随机数为一个int类型数组进行初始化赋值
* @param arr
*/
public static void initArr(int[] arr) {
Random rd=new Random();
for (int i = 0; i < arr.length; i++) {
arr[i]=rd.nextInt(arr.length);
}
}
}
对于希尔排序的优化没有去代码实现,但个人认为大概有两个方向:
1.直接插入排序时候因为是有序序列,采用折半查找元素插入的位置
2.采用较优的间隔d,在进行到插入排序时候会有更好的有序序列来进行插入操作