希尔排序
作者: 冯向阳
时间限制: 1s
章节: 课程设计
问题描述
对于顺序存储的线性表,使用vector或数组,实现希尔排序算法,并输出每趟的排序结果。
参考函数原型:(vector版本)
(1)//希尔排序(主函数)
template<class ElemType>
void ShellSort( vector<ElemType> &A, int dlta[], int t ); //t为希尔排序的趟数
(2)//希尔排序(一趟)
template<class ElemType>
void ShellInsert( vector<ElemType> &A, int dk );
输入说明
第一行:顺序表A的数据元素的数据类型标记(0:int,1:double,2:char,3:string)
第二行:待排序顺序表A的数据元素(数据元素之间以空格分隔)
第三行:希尔排序的趟数
第四行:希尔排序每趟的步长(步长之间以空格分隔)
输出说明
如第一行输入值为0、1、2、3之外的值,直接输出“err”
否则:
第一行:第一趟的步长,
第二行:第一趟的排序结果(数据元素之间用","分隔)
...
第n-1行:第n趟的步长,
第n行:最终的排序结果(数据元素之间用","分隔)
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
template<class ElemType>
void ShellInsert(vector<ElemType>& A, int dk) {
int n = A.size();
for (int i = dk; i < n; ++i) {
ElemType temp = A[i];
int j;
for (j = i; j >= dk && A[j - dk] > temp; j -= dk) {
A[j] = A[j - dk];
}
A[j] = temp;
}
}
template<class ElemType>
void ShellSort(vector<ElemType>& A, int dlta[], int t) {
for (int i = 0; i < t; ++i) {
int dk = dlta[i];
cout << dk << endl; // 输出步长
ShellInsert(A, dk);
for (int j = 0; j < A.size(); ++j) {
if (j > 0) cout << ",";
cout << A[j];
}
cout << endl;
}
}
template<class ElemType>
void readInput(vector<ElemType>& A, int& t, int dlta[]) {
string line;
getline(cin, line);
istringstream iss(line);
ElemType value;
while (iss >> value) {
A.push_back(value);
}
getline(cin, line);
t = stoi(line);
getline(cin, line);
iss.clear();
iss.str(line);
for (int i = 0; i < t; ++i) {
iss >> dlta[i];
}
}
int main() {
string type;
getline(cin, type);
if (type != "0" && type != "1" && type != "2" && type != "3") {
cout << "err" << endl;
return 0;
}
int t;
int dlta[100]; // 假设最多100趟
if (type == "0") {
vector<int> A;
readInput(A, t, dlta);
ShellSort(A, dlta, t);
}
else if (type == "1") {
vector<double> A;
readInput(A, t, dlta);
ShellSort(A, dlta, t);
}
else if (type == "2") {
vector<char> A;
readInput(A, t, dlta);
ShellSort(A, dlta, t);
}
else if (type == "3") {
vector<string> A;
readInput(A, t, dlta);
ShellSort(A, dlta, t);
}
return 0;
}