// // sort_.cpp // Sort // // Created by ljpc on 2018/4/20. // Copyright © 2018年 ljpc. All rights reserved. // #include "sort_.h" void print_array(int *arr, int n) // 打印数组 { if(n==0){ printf("ERROR: Array length is ZERO\n"); return; } printf("%d", arr[0]); for (int i=1; i<n; i++) { printf(" %d", arr[i]); } printf("\n"); } void sort_array(int *arr, int n) // 编程实现《希尔排序算法》:将乱序序列arr转化为升序序列 // 函数参数:乱序整数数组 数组长度 // 要求输出:调用print_array(int *arr, int n)输出三遍增量排序操作后的序列,以及最终的升序序列 { // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End **********/ } 测试输入: 8 6 10 5 2 4 9 1 7 预期输出: 6 1 5 2 4 9 10 7 4 1 5 2 6 7 10 9 1 2 4 5 6 7 9 10 1 2 4 5 6 7 9 10 测试输入: 10 7 1 4 6 8 9 5 2 3 10 预期输出: 7 1 2 3 8 9 5 4 6 10 2 1 5 3 6 4 7 9 8 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
时间: 2025-03-30 09:02:29 浏览: 24
### 希尔排序算法的实现与中间状态输出
希尔排序是一种基于插入排序的高效排序方法,通过逐步缩小增量来优化排序性能。以下是满足打印中间过程需求的 C++ 实现代码:
#### 完整代码示例
```cpp
#include <iostream>
#include <vector>
using namespace std;
class ShellSort {
public:
void sort(vector<int>& nums) {
int n = nums.size();
for (int gap = n / 2; gap > 0; gap /= 2) { // 计算初始步长并逐渐缩小
for (int i = gap; i < n; ++i) { // 对每个子序列进行插入排序
int temp = nums[i];
int j;
for (j = i; j >= gap && nums[j - gap] > temp; j -= gap) {
nums[j] = nums[j - gap]; // 移动元素
}
nums[j] = temp; // 插入当前元素
}
print(nums, gap); // 打印每次排序后的数组状态
}
}
private:
void print(const vector<int>& nums, int gap) const {
cout << "After sorting with gap=" << gap << ": ";
for (const auto& num : nums) {
cout << num << " ";
}
cout << endl;
}
};
int main() {
vector<int> data = {64, 34, 25, 12, 22, 11, 90};
ShellSort sorter;
cout << "Original array: ";
for (const auto& num : data) {
cout << num << " ";
}
cout << endl;
sorter.sort(data);
cout << "Sorted array: ";
for (const auto& num : data) {
cout << num << " ";
}
cout << endl;
return 0;
}
```
#### 关键点解析
- **初始化步长**:步长 `gap` 初始设置为数组长度的一半,并随着循环不断减半直到变为 1[^5]。
- **子序列排序**:对于每一个步长值,将相隔该步长的所有元素分为一组,并对该组执行插入排序。
- **中间状态打印**:在每一轮步长对应的子序列排序完成后,调用 `print` 函数输出当前数组的状态。
#### 时间复杂度分析
希尔排序的时间复杂度取决于所选的步长序列。通常情况下,其时间复杂度介于 \(O(n^{1.3})\) 和 \(O(n^2)\) 之间[^4]。相比普通的插入排序,它显著减少了不必要的比较和交换操作。
---
###
阅读全文
相关推荐











