oj-实现Shell排序-java

Description

实现Shell排序,对给定的无序数组,按照给定的间隔变化(间隔大小即同组数字index的差),打印排序结果,注意不一定是最终排序结果!

Input

输入第一行表示测试用例个数,后面为测试用例,每一个用例有两行,第一行为给定数组,第二行为指定间隔,每一个间隔用空格隔开。

Output

输出的每一行为一个用例对应的指定排序结果。

Sample Input 1

1
49 38 65 97 76 13 27 49 55 4
5 3

Sample Output 1

13 4 49 38 27 49 55 65 97 76

package org.alphacat.first;

import java.util.Scanner;

public class ShellSort {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int caseCount = scan.nextInt();

            scan.nextLine();

            for (int i = 0; i < caseCount; i++) {
                String input = scan.nextLine();
                String[] temp = input.split(" ");
                int[] arr = new int[temp.length];
                for (int j = 0; j < arr.length; j++) {
                    arr[j] = Integer.parseInt(temp[j]);
                }

                String stepString = scan.nextLine();
                String[] stepStrings = stepString.split(" ");

                int[] step = new int[stepStrings.length];
                for (int j = 0; j < stepStrings.length; j++) {
                    step[j] = Integer.parseInt(stepStrings[j]);
                }

                ShellSort(arr, step);

                println(arr);
            }

        }
    }

    private static void ShellSort(int[] arr, int[] step) {
        for (int i = 0; i < step.length; i++) {
            InsertSort(arr, step[i]);
        }
    }

    private static void InsertSort(int[] nums, int step) {
        for (int i = step; i < nums.length; i++) {
            int temp = nums[i];
            int j;
            for (j = i - step; j >= 0; j -= step) {
                if (temp < nums[j]) {
                    nums[j + step] = nums[j];
                } else {
                    break;
                }
            }
            nums[j + step] = temp;
        }
    }

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

    private static void print(int[] arr) {
        StringBuilder sb = getStringBuilder(arr);
        System.out.print(sb.toString());
    }

    private static void println(int[] arr) {
        StringBuilder sb = getStringBuilder(arr);
        System.out.println(sb.toString());
    }

    private static StringBuilder getStringBuilder(int[] arr) {
        int n = arr.length;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            sb.append(arr[i]);
            if (i != n - 1) {
                sb.append(" ");
            }
        }
        return sb;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值