运用C++采用基数排序对超大数组进行从小到大和从大到小的排序
时间: 2024-04-21 12:24:39 浏览: 137
用C++语言基数排序算法实现
4星 · 用户满意度95%
当处理超大数组时,我们可以采用基数排序的外部排序算法。外部排序将数据分成多个块,每次只处理一部分数据,并在最后将这些块合并起来得到最终的排序结果。下面是一个使用基数排序对超大数组进行从小到大和从大到小排序的示例代码:
```cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
const int MAX_DIGITS = 10; // 数字的最大位数
// 获取数字的某个位上的值
int getDigit(int num, int digit) {
for (int i = 0; i < digit - 1; i++) {
num /= 10;
}
return num % 10;
}
// 基数排序
void radixSort(std::vector<int>& data, bool ascending) {
int maxNum = *std::max_element(data.begin(), data.end()); // 获取最大值
int digitNum = 1; // 位数
while (maxNum > 10) {
maxNum /= 10;
digitNum++;
}
std::vector<std::vector<int>> buckets(10); // 桶数组
std::vector<int> temp(data.size(), 0); // 临时数组
for (int d = 1; d <= digitNum; d++) {
// 将数据分配到桶中
for (int i = 0; i < data.size(); i++) {
int digit = getDigit(data[i], d);
buckets[digit].push_back(data[i]);
}
// 将桶中的数据按顺序放回数组
int index = 0;
if (ascending) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < buckets[i].size(); j++) {
data[index++] = buckets[i][j];
}
buckets[i].clear();
}
} else {
for (int i = 9; i >= 0; i--) {
for (int j = 0; j < buckets[i].size(); j++) {
data[index++] = buckets[i][j];
}
buckets[i].clear();
}
}
}
}
int main() {
std::ifstream inFile("data.txt"); // 打开输入文件
std::vector<int> data;
int num;
while (inFile >> num) { // 从文件中读取数据
data.push_back(num);
}
inFile.close(); // 关闭输入文件
radixSort(data, true); // 从小到大排序
std::ofstream outFile("sorted_data.txt"); // 打开输出文件
for (int i = 0; i < data.size(); i++) { // 将排序结果写入文件
outFile << data[i] << " ";
}
outFile.close(); // 关闭输出文件
return 0;
}
```
在上述示例代码中,我们使用了桶数组来存储每个数字在当前位上的值。然后,根据需要的排序顺序,按顺序或逆序将桶中的数据放回原数组。通过多次迭代,逐位进行排序,最终得到排序结果。
请注意,代码中的 `data.txt` 是输入文件,其中包含待排序的数据。排序结果将写入 `sorted_data.txt` 文件中。
希望这可以帮助到您!如有任何疑问,请随时提问。
阅读全文