希尔排序

来源:互联网 发布:华为ar1200s mac绑定 编辑:程序博客网 时间:2024/05/17 07:18

今天复习希尔排序,代码如下:

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,在进行到插入排序时候会有更好的有序序列来进行插入操作

0 0
原创粉丝点击