基本排序_希尔排序_Java实现

来源:互联网 发布:js 资源加载异常捕获 编辑:程序博客网 时间:2024/05/07 01:48

转载请注明出处:http://blog.csdn.net/ljmingcom304/article/details/50371927
本文出自:【梁敬明的博客】

1.希尔排序

  希尔排序是直接插入排序的改进版,将序列按指定步长分为一组,对每组序列采用直接插入排序,然后将步长进行对半减小,重新进行分组,对每组序列采用直接插入排序,依次类推,直到减少到1,最终形成一个有序的序列。

希尔排序

  存在一个序列【8】【5】【9】【6】【7】【4】【3】【1】,将其按照从小到大的顺序进行排序。
  第一次排序,以4作为步长,分别将【8】【7】、【5】【4】、【9】【3】、【6】【1】分为一组,对每组进行直接插入排序。
  第二次排序,以2作为步长,分别将【7】【3】【8】【9】、【4】【1】【5】【6】分为一组,对每组进行直接插入排序。
  第三次排序,以1作为步长,将【3】【1】【7】【4】【8】【5】【9】【6】整个序列分为一组进行直接插入排序。

2.示例代码

  对一个长度为N的序列从小到大进行排序,当前进行第n次排序时,按序列步长分为N2n1组,对每组子序列分别进行直接插入排序,直到序列成为有序序列。

public class ShellSort {    public static void main(String[] args) {        int[] array = { 4, 7, 8, 6, 5, 9, 3, 0, 2, 3 };        ShellSort.sort(array);        System.out.println("排序后数组:" + Arrays.toString(array));    }    /**     * 将数组按步长进行分组,初始记录步长为数组长度的一半,然后采用直接插入排序对分组进行排序,     * 步长依次减少进行排序,每次步长均为上次步长的一半,当步长的值减少到1时,整个数据合并为一组,构成一组有序记录,则完成排序。     */    public static void sort(int[] a) {        int gap = a.length / 2;// 排序步长        // 将指定步长的元素分为一组        while (gap >= 1) {            //对每组进行直接插入排序            for (int i = gap; i < a.length; i++) {                int j = 0;                int temp = a[i];                if (temp >= a[i - gap])// 第i个数比有序序列的最后一个数大,则进行下一次循环                    continue;                for (j = i - gap; j >= 0 && temp < a[j]; j = j - gap) {                    a[j + gap] = a[j];                }                a[j + gap] = temp;            }            gap = gap / 2;// 减小步长        }    }}

3.算法分析

时间复杂度:
  算法的性能与所选分组的长度序列相关。
算法稳定性:
  相同数据间可能会发生位置交换,希尔排序属于不稳定的排序算法。

0 0