Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对数组排序(c+;+;) 我正在学习C++,我有任务创建数组[n] [m ],用整数来填充,然后 “矩阵行的特征称为其正偶数元素之和。您需要根据特征的增长对矩阵行进行排序。”_C++ - Fatal编程技术网

对数组排序(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;icout因为大小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(*比较)(常数无效*,常数无效*);

其中is
compar
是您编写的一个函数,它应该将其两个参数都视为指向矩阵中某一行的指针。然后它可以计算两行的特征,并根据哪一行的特征更大返回-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(*比较)(常数无效*,常数无效*);

其中is
compar
是您编写的一个函数,它应该将其两个参数都视为指向矩阵某一行的指针。然后它可以计算两行的特征,并根据哪一行的特征更大返回-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。