c++ - 无法将数组传递给排序函数(需要对列进行排序,而不是对行进行排序)
问题描述
我需要使用选择排序来对二维数组进行排序。问题是我需要对数组的列进行排序,而不是行。这是我分配二维数组的方式(以显示结构):
int** array = new int*[rows];
for (int i = 0; i < rows; i++) {
array[i] = new int[columns];
}
然后我在其中添加一些项目。这是我的排序功能:
void selectionSort(int* arr, int n)
{
int i, j, min_idx;
for (i = 0; i < n; i++)
{
min_idx = i;
for (j = i + 1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;
swap(&arr[min_idx], &arr[i]);
}
}
我没有指定交换,因为它是不言自明的。
所以,再次,我需要对矩阵的每一列进行排序。例如:
输入:
5 3 1
2 0 9
4 2 6
输出:
2 0 1
4 2 6
5 3 9
关于如何做到这一点的任何想法?现在我将矩阵转置两次,并在转置之间对它进行排序,但我认为这不是一个好的选择,因为它很慢。
解决方案
您可以将函数模板化为具有 int 的 getter:
template <typename F>
void selectionSort(F f, int size)
{
for (int i = 0; i < size; i++)
{
int min_idx = i;
for (int j = i + 1; j < size; j++)
if (f(j) < f(min_idx))
min_idx = j;
swap(f(min_idx), f(i));
}
}
所以,在一个维度上,你有你的旧:
selectionSort([arr](int i) -> int&{ return arr[i]; }, n);
对于列:
selectionSort([arr, j](int i) -> int&{ return arr[i][j]; }, n);
推荐阅读
- spring-boot - 输入错误的输入会给出 nullpointer 而不是 errorHandling
- c# - 使用 selectedIndex telerik WPF 设置 selectedItems
- azure-storage - Azure Devops:将静态网站部署到 Azure Blob 存储时出现凭据错误
- html - jQuerty:滚动到div的底部(内部内容的高度)
- vba - 根据VBA中的行内容将工作表拆分为不同的工作表
- html - 响应式标题图像问题
- java - 如何从 Java 中的 HTML 页面中提取和解析 CSS?
- api - 如何在 Microsoft 图形 API 的电子邮件正文中使用模板?
- flutter - 如何在 zefyr 中使用 embedBuilder?
- azure-web-app-service - 在 Azure 应用服务中使用联系表单通过 SendGrid 发送电子邮件时的奇怪行为