DS排序–希尔排序
题目描述
给出一个数据序列,使用希尔排序算法进行降序排序。
间隔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;
class Array{
int *array;
int len;
public:
Array(int n);
~Array();
void outPut();
void ShellInsert(int gap);
void ShellSort();
};
Array::Array(int n) {
len = n;
array = new int[n];
for(int i=0;i<n;i++)
cin>>array[i];
}
Array::~Array() {
delete []array;
}
void Array::outPut() {
for(int i=0;i<len;i++) {
cout << array[i];
if(i!=len-1)
cout<<' ';
}
cout<<endl;
}
void Array::ShellInsert(int gap) {
int k,i,j,temp;
for(k=0;k<gap;k++) {
for (i = k; i < len; i+=gap ){
temp = array[i];
for (j = i; j > k; j-=gap) {
if (temp > array[j - gap])
array[j] = array[j - gap];
else
break;
}
array[j] = temp;
}
}
}
void Array::ShellSort() {
int gap=len/2;
while (true)
{
ShellInsert(gap);
outPut();
if(gap==1)
break;
gap/=2;
}
}
int main() {
int t;
cin>>t;
while (t--) {
int n;
cin >> n;
Array myArray(n);
myArray.ShellSort();
cout<<endl;
}
return 0;
}