希尔排序

插入排序—希尔排

希尔排序(Shell’s Sort)又称“缩小增量排序”,它也是一种属插入排序类的方法,但在时间效率上较几种排序方法有较大的改进。

基本思想:
先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,在对全体记录进行一次直接插入排序


例如,待排序的一组记录的初始排列
49 38 65 97 76 13 27 49,其排序过程如下图所示:
这里写图片描述

由此可见希尔排序一个特点是:子序列的构成不是简单地“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。

具体算法:

public class TestTureOrFalse {
    public static void main(String[] args) {
        int arr[] = {9,5,8,7,4,6,3,2,1};
        sort(arr,arr.length);
        for (int i=0 ; i<arr.length ;i++)
            System.out.print(arr[i]+" ");
        System.out.println();
    }

    public static void sort(int[] arr, int length) {
        int m = length/2;
        while (m>=1){
            shellsort(arr,length,m);
            m = m/2;
        }
    }
    //对数组进行间隔为m的插入排序
    public static void shellsort(int[] arr, int length, int m) {
        for (int i=m ; i<length ;i++){
            if (arr[i]<arr[i-m]){
                int j ;
                int temp =arr[i];
                for (j=i-m ;j>=0&&arr[j]>temp; j-=m){
                    arr[j+m] = arr[j];

                }
                arr[j+m] = temp ;
            }
            //输出每次排序的结果
            sout(arr, length, i);
        }
    }
    public static void sout(int arr[],int n,int i){
        System.out.print("角标"+i+": ");
        for (int j=0 ; j<arr.length ;j++)
            System.out.print(arr[j]+" ");
        System.out.println();
    }

}

或者将增量和插入弄到一个方法里面:

#include <stdio.h>
#include <stdlib.h>
//输出每次排序结果
void sout(int num[] ,int n ,int i)
{
    printf(" %d : ",i);
    int j ;
    for (j=0 ; j<n ; j++)
        printf("%d ",num[j]);
    printf("\n");
}
void shellSort2(int num[] , int n )
{
    int i ,d;
    for (d=n/2 ; d>=1 ;d/=2)
    {
        for (i=d ; i<n ;i++)
        {
            if (num[i]<num[i-d])
            {
                int temp = num[i];
                int j ;
                for (j=i-d ; num[j]>temp&&j>=0 ; j-=d)
                {
                    num[j+d] = num[j];
                }
                num[j+d] = temp ;
            }
            sout(num,n,i);
        }
    }

}

int main(void)
{
    int a[9] = {9,5,8,7,4,6,3,2,1};
    int i;
    //time(a,8);
   shellSort2(a,9);
    for (i=0 ; i<9 ; i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

增量因子序列可以有各种取法,有取奇数的,也有取质数的,取增量序列时应该注意:增量序列中的值没有除1之外的公因子,并且最后一个增量值必须等于1.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值