对数组排序(c+;+;) 我正在学习C++,我有任务创建数组[n] [m ],用整数来填充,然后 “矩阵行的特征称为其正偶数元素之和。您需要根据特征的增长对矩阵行进行排序。”
这是我的密码对数组排序(c+;+;) 我正在学习C++,我有任务创建数组[n] [m ],用整数来填充,然后 “矩阵行的特征称为其正偶数元素之和。您需要根据特征的增长对矩阵行进行排序。”,c++,C++,这是我的密码 #include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { srand((unsigned)time(NULL)); int n, m; cout << "n = "; cin >> n; cout << "m = "; cin >> m; int ** mas = new int * [n]; for (int i = 0; i
#include "stdafx.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned)time(NULL));
int n, m;
cout << "n = ";
cin >> n;
cout << "m = ";
cin >> m;
int ** mas = new int * [n];
for (int i = 0; i < n; ++i)
{
mas[i] = new int[m];
}
cout << "Array:\n";
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
mas[i][j] = rand()%41-20;
cout << mas[i][j] << "\t";
}
cout << "\n";
}
double * characteristic = new double[n];
for (int i = 0; i < n; ++i)
{
characteristic[i] = 0;
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
if((j%2 == 0) && (mas[i][j] >= 0))
{
characteristic[i] += mas[i][j];
}
}
}
cout << "Characteristics:\n";
for (int i = 0; i < n; ++i)
{
cout << characteristic[i] << " ";
}
cout << "\n";
for (int i = 0; i < n - 1; ++i)
{
int min = i;
for (int j = i + 1; j < n; ++j)
{
if (characteristic[min] <= characteristic[j]) continue;
min = j;
}
if (min != i)
{
double temp = characteristic[i];
characteristic[i] = characteristic[min];
characteristic[min] = temp;
for (int k = 0; k < m; ++k)
{
int temp1 = mas[i][k];
mas[i][k] = mas[min][k];
mas[min][k] = temp1;
}
}
}
cout << "\nSorted characteristics:\n";
for (int i = 0; i < n; ++i)
{
cout << characteristic[i] << " ";
}
cout << "\n";
cout << "Sorted array:\n";
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
cout << mas[i][j] << "\t";
}
cout << "\n";
}
for (int i = 0; i < n; ++i)
{
delete [] mas[i];
}
delete [] mas;
delete [] characteristic;
system("PAUSE");
return 0;
}
#包括“stdafx.h”
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
srand((无符号)时间(NULL));
int n,m;
cout>n;
cout>m;
整数**mas=新整数*[n];
对于(int i=0;i cout因为大小n,m在编译时是已知的,所以可以使用C库中的qsort
函数
#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
#包括
void qsort(void*base,size\u t nmb,size\u t size,
int(*比较)(常数无效*,常数无效*);
其中iscompar
是您编写的一个函数,它应该将其两个参数都视为指向矩阵中某一行的指针。然后它可以计算两行的特征,并根据哪一行的特征更大返回-1、0或1。由于大小n、m在编译时已知,因此可以使用qsort
fC库中的函数
#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
#包括
void qsort(void*base,size\u t nmb,size\u t size,
int(*比较)(常数无效*,常数无效*);
其中iscompar
是您编写的一个函数,它应该将其两个参数都视为指向矩阵某一行的指针。然后它可以计算两行的特征,并根据哪一行的特征更大返回-1、0或1。是否也要使用与“特征”相同的顺序对矩阵进行排序是什么
让我们假设你有C++风格的代码来计算特性:
std::vector<double> characteristic(n, 0.0);
std::transform(begin(mas), end(mas), begin(characteristic), sum_);
或者,您可以立即对矩阵进行排序:
std::sort(begin(mas), end(mas), [&sum_](int_vec const& a, int_vec const& b)
{ return sum_(a)<sum_(b); });
您是否也希望使用与“特征”相同的顺序对矩阵进行排序
让我们假设你有C++风格的代码来计算特性:
std::vector<double> characteristic(n, 0.0);
std::transform(begin(mas), end(mas), begin(characteristic), sum_);
或者,您可以立即对矩阵进行排序:
std::sort(begin(mas), end(mas), [&sum_](int_vec const& a, int_vec const& b)
{ return sum_(a)<sum_(b); });
@ SEHE给了你很好的建议,但是我怀疑很多东西在你知道更多的C++之前就没有意义了。
这里有一个简单的改进,可以消除慢循环:
进行行交换时,交换行指针,而不是复制它们指向的每个值。替换为:
for (int k = 0; k < m; ++k)
{
int temp1 = mas[i][k];
mas[i][k] = mas[min][k];
mas[min][k] = temp1;
}
如果你能想出如何使用一个内置的排序算法,这将是另一个改进,但是这个小的改变会给你带来很多。
@ SEHE给了你很好的建议,但是我怀疑很多东西在你知道更多的C++之前是没有意义的。
这里有一个简单的改进,可以消除慢循环:
进行行交换时,交换行指针,而不是复制它们指向的每个值。替换为:
for (int k = 0; k < m; ++k)
{
int temp1 = mas[i][k];
mas[i][k] = mas[min][k];
mas[min][k] = temp1;
}
如果你能想出如何使用一个内置的排序算法,这将是除此之外的另一个改进,但即使是这个小小的改变也会让你受益匪浅。尝试std::vector of std::vectors,然后使用自定义谓词对std::sort进行排序,那么它看起来就像c++如果矩阵只包含double
作为特征ode>ints?如果你可以自由选择你自己的矩阵结构,那么就不要使用Dmetry建议的2D数组,或者使用指向1D数组的指针数组。这样,你只需交换指针(或vector.swap()
)就可以交换整行。这将使你的行从O(n^2)
交换到O(n)
@n.m.事实上,我要打电话给你关于std::array
的事情:n
和m
是动态的。你告诉我如何制作一个动态大小的std::array
@Adam,同意:)如果不是这样的话,我的答案应该是使用std::array
,试试std::vectors的std::vectors,然后是std::使用自定义谓词排序,那么它看起来就像c++如果矩阵只包含int
s,为什么要使用double
作为特征?如果您可以自由选择自己的矩阵结构,那么使用Dmetry建议的2D数组,或者指向1D数组的指针数组,而不是2D数组。这样,您可以通过简单的交换来交换整行正在初始化指针(或vector.swap()
)。它将您的行从O(n^2)
交换到O(n)
@n.m.事实上,我要打电话给你关于std::array
的事情:n
和m
是动态的。你告诉我如何制作一个动态大小的std::array
@Adam,同意:)如果不是因为这个,我的答案应该是使用std::array
,老实说,qsort是C,而不是类型安全的。我会选择rECOMMDENSTD::排序。@ Couple LeulsOutlook看到我的答案(虽然这可能是家庭作业,而我的答案将是没有什么用处,除非老师对使用1990年C++在课堂上出人意料地开放)。在编译时,不知道SZG<代码> N>代码>代码> M>代码。显然,您仍然可以编写一个比较器函数,但我认为您必须求助于全局变量。<代码> STD::排序< /COD>不存在这个问题,而可以使用一个比较器对象。@ Cdou-Yes,我知道C是邪恶的,不是类型安全的,完全不兼容C++。这就是为什么Linux内核使用C++。哦等等……SZG:问题是C++,而不是C。老实说,Q排序是C而不是类型安全。我建议STD::排序。看我的答案(虽然这可能是家庭作业,而我的答案将是没有什么用处的,除非老师在课堂上使用1990年C++后出人意料地开放):在编译时,不知道SZG<代码> N>代码>代码> M>代码。显然,您仍然可以编写一个比较器函数,但我认为您必须求助于全局变量。<代码> STD::排序< /COD>不存在这个问题,而可以使用一个比较器对象。@ Cdou-Yes,我知道C是邪恶的,不是类型安全的,完全不兼容C++。这就是为什么Linux内核使用C++。哦等等…@ SZG:问题是关于C++,而不是C。