明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。c++
【以下回答由 GPT 生成】
如果数组已经排序,可以使用两个指针来遍历数组。一个指针 i
用于追踪当前不重复元素的位置,另一个指针 j
用于遍历数组,查找不同于前一个元素的元素。
#include <iostream>
#include <vector>
std::vector<int> removeDuplicates(std::vector<int>& nums) {
if (nums.empty()) {
return nums;
}
int i = 0;
for (int j = 1; j < nums.size(); j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
nums.resize(i + 1);
return nums;
}
int main() {
std::vector<int> nums = {1, 2, 2, 3, 4, 4, 4, 5};
nums = removeDuplicates(nums);
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
运行结果为:1 2 3 4 5
可以使用递归的快速排序算法来对数组进行排序。快速排序的思想是选取一个基准元素,将数组分为两部分,小于基准元素的放在左边,大于基准元素的放在右边,然后对两部分进行递归排序。
#include <iostream>
#include <vector>
void quickSort(std::vector<int>& nums, int low, int high) {
if (low >= high) {
return;
}
int pivot = nums[high];
int i = low - 1;
for (int j = low; j <= high - 1; j++) {
if (nums[j] < pivot) {
i++;
std::swap(nums[i], nums[j]);
}
}
std::swap(nums[i + 1], nums[high]);
int partitionIndex = i + 1;
quickSort(nums, low, partitionIndex - 1);
quickSort(nums, partitionIndex + 1, high);
}
int main() {
std::vector<int> nums = {5, 4, 3, 2, 1};
quickSort(nums, 0, nums.size() - 1);
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
运行结果为:1 2 3 4 5
计数排序是一种线性时间的排序算法,适用于整数数据和已知范围的情况。
#include <iostream>
#include <vector>
void countSort(std::vector<int>& nums) {
int maxVal = *max_element(nums.begin(), nums.end());
int minVal = *min_element(nums.begin(), nums.end());
int range = maxVal - minVal + 1;
std::vector<int> count(range), output(nums.size());
for (int num : nums) {
count[num - minVal]++;
}
for (int i = 1; i < range; i++) {
count[i] += count[i - 1];
}
for (int i = nums.size() - 1; i >= 0; i--) {
output[count[nums[i] - minVal] - 1] = nums[i];
count[nums[i] - minVal]--;
}
for (int i = 0; i < nums.size(); i++) {
nums[i] = output[i];
}
}
int main() {
std::vector<int> nums = {5, 4, 3, 2, 1};
countSort(nums);
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
运行结果为:1 2 3 4 5
可以使用 std::sort
函数对 C++ 数组进行排序。 std::sort
使用快速排序算法来排序数组。
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> nums = {5, 4, 3, 2, 1};
std::sort(nums.begin(), nums.end());
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
运行结果为:1 2 3 4 5
可以先使用上面的去重和排序方法来处理数组,然后按照需要进行输出。
#include <iostream>
#include <algorithm>
#include <vector>
std::vector<int> removeDuplicates(std::vector<int>& nums) {
if (nums.empty()) {
return nums;
}
int i = 0;
for (int j = 1; j < nums.size(); j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
nums.resize(i + 1);
return nums;
}
void quickSort(std::vector<int>& nums, int low, int high) {
if (low >= high) {
return;
}
int pivot = nums[high];
int i = low - 1;
for (int j = low; j <= high - 1; j++) {
if (nums[j] < pivot) {
i++;
std::swap(nums[i], nums[j]);
}
}
std::swap(nums[i + 1], nums[high]);
int partitionIndex = i + 1;
quickSort(nums, low, partitionIndex - 1);
quickSort(nums, partitionIndex + 1, high);
}
int main() {
std::vector<int> nums = {5, 4, 3, 4, 1, 2, 1};
nums = removeDuplicates(nums);
quickSort(nums, 0, nums.size() - 1);
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
运行结果为:1 2 3 4 5
以上是给出的具体解决方案,希望对你有帮助。如果你还有其他问题,欢迎继续提问。
【相关推荐】