#include <iostream> #include <vector> // 希尔排序 void shellSort(std::vector<int>& arr) { int n = arr.size(); for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int temp = arr[i]; int j; for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) { arr[j] = arr[j - gap]; } arr[j] = temp; } } } // 数组倒序 void reverseArray(std::vector<int>& arr) { int start = 0; int end = arr.size() - 1; while (start < end) { std::swap(arr[start], arr[end]); start++; end--; } } int main() { std::vector<int> arr = {}; // 希尔排序 shellSort(arr); std::cout << "希尔排序后的数组:"; for (int num : arr) { std::cout << num << " "; } std::cout << std::endl; // 数组倒序 reverseArray(arr); std::cout << "数组倒序结果:"; for (int num : arr) { std::cout << num << " "; } std::cout << std::endl; return 0; } 注释
时间: 2024-04-16 08:30:05 浏览: 88
这是一个包含希尔排序和数组倒序功能的程序。它使用了两个函数:shellSort和reverseArray。
shellSort函数实现了希尔排序算法。它接受一个整数向量arr,并通过分组插入排序的方式对其进行排序。算法的主要思想是先将数组分成若干个较小的子数组,对每个子数组进行插入排序,然后逐渐减小子数组的间隔,继续进行插入排序,直到间隔为1时完成最后一次插入排序。
reverseArray函数用于将数组倒序。它接受一个整数向量arr,并使用两个指针start和end来交换元素,以实现数组的倒序。
在主函数中,程序首先定义了一个空的整数向量arr。然后,它调用shellSort函数对arr进行排序,并输出排序后的结果。接着,它调用reverseArray函数对arr进行倒序,并输出倒序后的结果。
最后,程序返回0表示正常运行结束。
如果你对这段代码有任何疑问,请随时提问。
相关问题
用c++编写程序,实现插入类排序: 1.直接插入排序 2.折半插入排序 3.希尔排序 使用using nanesoace std;,含有一个menu(),使可以选择使用哪种排序方法
在C++中,我们可以分别编写三个函数来实现三种不同的插入排序算法。这里是一个简单的例子:
```cpp
#include <iostream>
#include <vector>
// 1. 直接插入排序
void insertionSortDirect(std::vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
// 2. 折半插入排序(二分查找辅助)
void insertionSortBinarySearch(std::vector<int>& arr) {
for (int i = 1; i < arr.size(); ++i) {
int key = arr[i];
int low = 0, high = i - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] > key)
high = mid - 1;
else
low = mid + 1;
}
arr.insert(arr.begin() + low, key);
}
}
// 3. 希尔排序
void shellSort(std::vector<int>& arr) {
const int gap = arr.size() / 2;
while (gap > 0) {
for (int i = gap; i < arr.size(); ++i) {
int temp = arr[i];
int j;
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
arr[j] = arr[j - gap];
arr[j] = temp;
}
gap /= 2;
}
}
// 主菜单函数
void menu() {
std::cout << "选择排序方法:\n";
std::cout << "1. 直接插入排序\n";
std::cout << "2. 折半插入排序\n";
std::cout << "3. 希尔排序\n";
int choice;
std::cin >> choice;
switch (choice) {
case 1:
std::vector<int> vec({4, 2, 9, 6, 5, 1});
insertionSortDirect(vec);
break;
case 2:
std::vector<int> vec({4, 2, 9, 6, 5, 1});
insertionSortBinarySearch(vec);
break;
case 3:
std::vector<int> vec({4, 2, 9, 6, 5, 1});
shellSort(vec);
break;
default:
std::cerr << "无效的选择!" << std::endl;
return;
}
std::cout << "排序后的数组:\n";
for (const auto& num : vec) {
std::cout << num << " ";
}
std::cout << "\n";
}
int main() {
menu();
return 0;
}
```
在这个示例中,我们首先定义了三种插入排序的函数,然后在`menu`函数中根据用户输入选择相应的排序方法并执行。注意这只是一个基础版本,实际应用时可以根据需要添加错误处理和用户输入验证。
写出希尔排序算法的c++代码
希尔排序(Shell Sort)是一种高效的插入排序改进版本,它通过分组的方式逐步将数据接近有序。以下是使用C++编写的希尔排序算法示例:
```cpp
#include <iostream>
#include <vector>
void gapInsertionSort(std::vector<int>& arr, int gap) {
for (int i = gap; i < arr.size(); i++) {
int temp = arr[i];
int j = i;
// 将gap范围内的元素向右移动
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
void shellSort(std::vector<int>& arr) {
// 选择初始步长序列,这里使用最简单的1, 4, 16, ... 方法
for (gap := arr.size() / 2; gap > 0; gap /= 2) {
gapInsertionSort(arr, gap);
}
}
int main() {
std::vector<int> nums = {9, 7, 5, 11, 12, 2, 14, 3};
std::cout << "Original array: ";
for (int num : nums) {
std::cout << num << " ";
}
std::cout << std::endl;
shellSort(nums);
std::cout << "Sorted array: ";
for (int num : nums) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
```
阅读全文