题目描述
给出一个数据序列,使用希尔排序算法进行降序排序。
间隔gap使用序列长度循环除2直到1
输入
第一行输入t,表示有t个测试示例
第二行输入n,表示第一个示例有n个数据(n>1)
第三行输入n个数据,都是正整数,数据之间用空格隔开
以此类推
输出
对每组测试数据,输出每趟排序结果。不同组测试数据间用空行分隔。
样例输入
2
6
111 22 6 444 333 55
8
77 555 33 1 444 77 666 2222
样例输出
444 333 55 111 22 6
444 333 111 55 22 6
444 555 666 2222 77 77 33 1
666 2222 444 555 77 77 33 1
2222 666 555 444 77 77 33 1
#include <iostream>
using namespace std;
void shell_sort()
{
int *data;
int n;
cin>>n;
data = new int[n];
for(int i=0;i<n;i++)
cin>>data[i];
for(int gap = n/2; gap > 0; gap /= 2) //间隔从n/2降到1
{
for(int j = 0; j < gap; j++) //根据gap划分为n个组
{
for(int p = j; p < n; p += gap) //对这些组进行2层循环插入排序
{
for(int k = p; k > 0; k -= gap)
{
if(k - gap >= 0 && data[k] > data[k-gap])
swap(data[k], data[k-gap]);
else
break;
}
}
}
for(int j=0;j<n;j++) //输出数据
{
cout<<data[j];
if(j!=n-1)
cout<<' ';
}
cout<<endl;
}
delete[] data;
}
int main()
{
int t;
cin>>t;
while(t--)
{
shell_sort();
cout<<endl;
}
}