希尔排序(数据结构实训)(难度系数85)

本文详细介绍了希尔排序算法的工作原理,通过增量序列将线性表分割并应用直接插入排序,给出了样例输入和输出过程,展示了如何使用Java实现希尔排序的代码。

题目:

希尔排序
描述

利用希尔排序算法实现线性表的排序。希尔排序是根据给定的增量序列将线性表分隔成某个“增量”的记录组成一个子序例,在子序列中采用直接插入排序完成。

输入

第一行为元素个数n(1<=n<=1000),第二行为n个元素值(整数),即需要排序的元素个数,第三行增量序列中增量个数m,第四行为m个增量,可以假定最后一个增量为1。

输出

对每一测试用例,用m行输出各增量进行希尔排序结果,用空格隔开。

样例输入
10
49 38 65 97 76 13 27 49 55 4
3
5 3 1

样例输出

13 27 49 55 4 49 38 65 97 76
13 4 49 38 27 49 55 65 97 76
4 13 27 38 49 49 55 65 76 97

代码:

要了解什么是希尔排序,即假如增量为5,应该把数组分为5个部分,10/5=2,每个部分2个数,如果是11则11/5=2,余1,分成5个部分,每个部分2个数,有一个部分有3个数,每个部分都应该重新排序按从小到大,按样例来说

49 38 65 97 76 13 27 49 55 4

增量为5时,前5个数为每个部分的第一个数,每逢5个数,为同一部分

{49,13}{38,27}{65,49}{97,55}{76,4}5个部分

排序后

{13,49}{27,38}{49,65}{55,97}{4,76}

13 27 49 55 4 49 38 65 97 76

假如在后面加个2

从10位变成11位数组

49 38 65 97 76 13 27 49 55 4 2

{49,13,2}{38,27}{65,49}{97,55}{76,4}5个部分

排序后

{2,13,49}{27,38}{49,65}{55,97}{4,76}

2 27 49 55 4 13 38 65 97 76 49

import java.util.Scanner;
import java.util.Arrays;
public class Xingyuxingxi {
    public static void main(String[] args) {
        int a;
        Scanner sc=new Scanner(System.in);
        a=sc.nextInt();
        int []b=new int[a+5];
        for (int i = 0; i <a ; i++) {
            b[i]=sc.nextInt();
        }
        int c=sc.nextInt();
        while(c--!=0)
        {
            int p=sc.nextInt();
            int x=a/p;//每个部分至少应该有几个数
            int y=a%p;//看是否刚好分完,余数为0则刚好分完,否则有y个部分多了一个数
            int [][]q=new int[p+5][x+5];//用q数组将一维数组分为,p个部分,每个部分x或x+1个数,因为a%p不一定刚好为0,所以有部分会多出一个数
            for (int i = 0; i <p; i++) {
                int n=0;
                for (int j = i; j < a; j+=p) {
                    q[i][n++]=b[j];//存到p中

                }
                Arrays.sort(q[i],0,n);//对每个部分都进行排序
            }
            int n=0;
            for (int j = 0; j < x+1; j++) {//x+1是因为有些部分可能多一个数,并且多一个数的部分一定在前面的行数
                if(j==x)p=y;//最后一列的数字数为y,如果刚好没多一个数,y为0则不用进行下一个循环
                for (int i = 0; i < p; i++) {
                    b[n++] = q[i][j];//要按照先列后行的顺序输出
                }
            }
            for (int i = 0; i <a ; i++) {
                System.out.print(b[i]+" ");//按顺序输出此次希尔排序顺序
            }
            System.out.println();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星与星熙.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值