数据结构与算法——希尔排序算法

算法描述

       希尔排序算法也称为“缩小增量排序”,其基本思想是将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后再对所有元素进行一次直接插入排序。因此,我们要采用跳跃分割的策略,将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果基本有序而不是局部有序。希尔排序算法是对直接插入排序算法的优化和升级。(基本有序就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间。)

代码实现:

 1 public class ShellSort {
 2     
 3     public void shellSort(int[] arr) {
 4         int increment=arr.length;
 5         while(increment>1) {
 6             increment=(increment+1)/2;    //增量序列
 7             for(int i=0;i<arr.length-increment;i++) {
 8                 if(arr[i+increment]<arr[i]) {
 9                     swap(arr,i,i+increment);
10                 }
11             }
12         }
13     }
14     public void swap(int[] arr,int i,int j) {
15         int temp=arr[i];
16         arr[i]=arr[j];
17         arr[j]=temp;
18     }
19 }

希尔排序算法的时间复杂度分析

  • 最坏情况的时间复杂度:O(n2)
  • 最好情况的时间复杂度:O(n1.3)
  • 平均时间复杂度:O(nlogn)~O(n2)
  • 空间复杂度:O(1)
  • 算法的稳定性:希尔排序算法是不稳定的(希尔排序中相等数据可能会交换位置)

posted on 2018-04-01 11:26  Joyce&wang  阅读(221)  评论(0)    收藏  举报

导航