题目:
希尔排序
描述利用希尔排序算法实现线性表的排序。希尔排序是根据给定的增量序列将线性表分隔成某个“增量”的记录组成一个子序例,在子序列中采用直接插入排序完成。
输入
第一行为元素个数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();
}
}
}
本文详细介绍了希尔排序算法的工作原理,通过增量序列将线性表分割并应用直接插入排序,给出了样例输入和输出过程,展示了如何使用Java实现希尔排序的代码。
1万+

被折叠的 条评论
为什么被折叠?



