题目描述
【问题描述】利用希尔排序思想实现一系列1000以内的正整数的排序。
【输入形式】第1行为增量序列的个数;第2行为每个增量;第3行开始输入若干1000以内的正整数,-1结束输入。
【输出形式】先输出排序前的原始数据,再输出每趟希尔排序后的数据;最后输出排好序的结果。
【样例输入】
3
5 3 1
49 38 65 97 76 13 27 48 55 4 -1
【样例输出】
the resource datas is:
49 38 65 97 76 13 27 48 55 4
every shellinsert px result is
13 27 48 55 4 49 38 65 97 76
13 4 48 38 27 49 55 65 97 76
4 13 27 38 48 49 55 65 76 97
the shellinsert result datas is:
4 13 27 38 48 49 55 65 76 97
解题思路
希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。然后减小gap的值,并重复执行上述的分组和排序。重复这样的操作,当gap=1时,整个数列就是有序的,本题中模拟希尔排序过程并且d依次取数组值。
源代码
#include <bits/stdc++.h>
using namespace std;
//递归输出数组
void Print(int *arr, int i, int n) {
if (i < n) {
cout << setw(4) << arr[i];
Print(arr, i + 1, n);
}
}
//希尔排序
void ShellSort(int *arr, int len,int *dist,int len2) {
int i, j, d, temp, k = 0;
d = dist[k++];
while (k <= len2) {
for (i = d; i < len; i++) {
temp = arr[i];
j = i - d;
while (j >= 0 && temp < arr[j]) {
arr[j + d] = arr[j];
j -= d;
}
arr[j + d] = temp;
}
d = dist[k++];
Print(arr, 0, len);
cout << endl;
}
}
int main() {
int num[1001], x, i;
int n, dist[100];
cin >> n;
for (i = 0; i < n; i++)
cin >> dist[i];
i = 0;
while (1) {
cin >> x;
if (x == -1)
break;
num[i++] = x;
}
cout << "the resource datas is:" << endl;
Print(num, 0, i);
cout << endl;
cout << "every shellinsert px result is" << endl;
ShellSort(num, i, dist, n);
cout << "the shellinsert result datas is:" << endl;
Print(num, 0, i);
cout << endl;
system("pause");
return 0;
}
总结
插入排序的一种~