我正在为我的C ++类编写一个程序,它接受用户输入int和char数组的大小,用随机值(数字0-100,字母AZ)填充数组,然后排序,反转和显示两个阵列。
大部分程序都有效,我理解我在这里使用的逻辑,但是......
多次运行和调试代码后。我注意到当数组填充值时,第一个元素,即使它实际上被赋予了一个值,它也不会打印按升序给出的赋值,而是按降序排列?我根本不明白这一点。
注意:我必须使用模板函数来排序,反转和显示数组。
template <class T>
void sort(T *arr, int a) {
T temp;
for (int i = 0; i < a; i++) {
for (int j = a; j > 0; j--) {
if (arr[i] > arr[j]) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
template <class T>
void reverse(T *arr, int a) {
T temp;
for (int i = 0; i < a / 2; i++) {
temp = arr[i];
arr[i] = arr[a - i];
arr[a - i] = temp;
}
}
template <class T>
void display(T *arr, int a) {
for (int i = 0; i < a; i++) {
cout << arr[i] << ", ";
}
cout << endl;
}
template<class T>
void save(T *arr, int a) {
sort(arr, a);
display(arr, a);
reverse(arr, a);
display(arr, a);
}
int main() {
int x, y;
cout << "Please enter a number for an array of data type \"int\"" << endl;
cin >> x;
cout << "Please enter a number for an array of data type \"char\"" << endl;
cin >> y;
int *arr1 = new int[x];
char *arr2 = new char[y];
for (int i = 0; i < x; i++)
cout << (arr1[i] = rand() % 100 + 1);
srand(time(nullptr));
for (int i = 0; i < y; i++)
cout << (arr2[i] = rand() % 26 + 65);
system("cls");
save(arr1, x);
save(arr2, y);
delete[]arr1;
delete[]arr2;
system("pause");
return 0;
}
答案 0 :(得分:1)
你在几个地方都有一个不合适的错误。
for (int j = a; j > 0; j--) {
不正确。 a
是数组的无效索引。将该行更改为使用j = a-1
:
for (int j = a-1; j > 0; j--) {
reverse
中有一个类似的,一个一个错误的错误。而不是
arr[i] = arr[a - i];
arr[a - i] = temp;
你需要使用:
arr[i] = arr[a - i - 1];
arr[a - i - 1] = temp;
您对sort
的实施不正确。我不想在此处查看算法详细信息,但更改用于j
的值的顺序似乎可以解决问题。
for (int i = 0; i < a; i++) {
for (int j = i+1 ; j < a ; j++) {
// The swapping code.
}
}
答案 1 :(得分:1)
您在这里使用完整的长度:
save(arr1, x);
save(arr2, y);
所以在reverse
arr[i] = arr[a - i];
arr[a - i] = temp;
你需要-1的长度,否则当i == 0
时你会得到一个无效的索引 arr[i] = arr[a - 1 - i];
arr[a - 1 - i] = temp;
与sort
for (int j = a; j > 0; j--) {
你需要-1,因为a是一个无效索引的长度。
for (int j = a-1; j > 0; j--) {
作为旁注,您可以在Temp t
内的for
循环内以及reverse
中的if
内宣布sort
,因为它只是用于这些范围。
编辑:
我也忽略了,sort
你需要改变
j>0
到
j >= 0
这样你也可以访问数组的第一个元素。
答案 2 :(得分:0)
您正在使用O(n ^ 2)时间复杂度的冒泡排序。考虑使用更快的算法。如果您不想自己实现它,请使用sort()函数。它的复杂性大约是O(n log n),非常好。
http://www.cplusplus.com/reference/algorithm/sort/
#include <iostream>
#include <algorithm>
using namespace std;
bool comp(int i1, int i2) { // comp function is to compare two integers
return i1 < i2;
}
int main() {
int x[30];
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x[i];
}
sort(x, x + n, comp); // if you don't provide comp function ( sort(x, x+n) ), sort() function will use '<' operator
for (int i = 0; i < n; i++) {
cout << x[i] << " ";
}
return 0;
}