希尔排序(升序)

一、思想

设待排序元素共有n个元素,首先取一个整数gap<n作为间隔,将全部元素分为间隔为gap的gap个子序列,并对每一个子序列进行插入排序。然后,缩小间隔gap,重复上述操作,直至gap缩小为1,此时,所有元素位于同一个序列且有序。由于刚开始时,gap较大,每个子序列元素较少,排序速度较快;待到排序后期,gap变小,每个子序列元素较多,但大多数元素基本有序,所以排序速度仍较快。一般的,gap取(gap/3+1)。希尔排序是一种不稳定的排序方法,其实现如下:

二、代码

/**        
 * Title: 插入排序中的希尔排序,依赖于初始序列    
 * Description: 分别对间隔为gap的gap个子序列进行直接插入排序,不断缩小gap,直至为 1 
 * 
 *              刚开始时,gap较大,每个子序列元素较少,排序速度较快;
 *              待到排序后期,gap变小,每个子序列元素较多,但大部分元素基本有序,所以排序速度仍较快。                
 * 
 *              时间复杂度:O(n) ~ O(n^2)
 *              空间复杂度:O(1)
 *              稳    定   性:不稳定
 *              内部排序(在排序过程中数据元素完全在内存)
 * @author rico       
 * @created 2017年5月20日 上午10:40:00    
 */      
public class ShellSort {
    public static void shellSort(int[] target) {
        if (target != null && target.length != 1) {

            int gap = target.length;    

            while (gap > 1) {      // gap为int型,自动取整
                gap = gap / 3 + 1;
                for (int i = gap; i < target.length; i++) {

                    int j = i - gap;

                    while (j >= 0) {
                        if (target[j + gap] < target[j]) {
                            swap(target, j, j+gap);
                            j -= gap;
                        }else{
                            break;
                        }
                    }
                }
            }
        }
    }


    public static void swap(int[] target, int i, int j) {
        int temp = target[i];
        target[i] = target[j];
        target[j] = temp;
    }
}

三、时间复杂度

O(n)~O(n^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值