目录
1. 问题描述:
我们有一个二维数组,类型为 `double`,需要根据每个子数组的第一个元素进行排序。如果第一个元素相同,则根据第二个元素排序,以此类推。要求使用插入排序算法实现。
2. 问题解析:
- 输入: 一个二维数组 `arr`,类型为 `double`,大小为 `rows x cols`。
- 输出: 排序后的二维数组。
- 排序规则:
- 首先根据每个子数组的第一个元素排序。
- 如果第一个元素相同,则根据第二个元素排序。
- 以此类推,直到所有元素都比较完毕。
- 算法: 插入排序。
3. 编写函数:
以下是实现代码:
/*-----------------------------------------------------------------------*/
#include <stdio.h>
#include <stdbool.h>
/*-----------------------------------------------------------------------*/
// 比较两个子数组的大小
bool is_greater(double *a, double *b, int cols)
{
int i = 0;
for (i = 0; i < cols; i++)
{
if (a[i] > b[i])
{
return true;
}
else if (a[i] < b[i])
{
return false;
}
}
return false; // 如果所有元素都相等,返回 false
}
/*-----------------------------------------------------------------------*/
// 插入排序函数
void insertion_sort(double **arr, int rows, int cols)
{
int i = 1;
int j = 0;
for (i = 1; i < rows; i++)
{
double *current = arr[i];
j = i - 1;
// 将当前子数组插入到正确位置
while (j >= 0 && is_greater(arr[j], current, cols))
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = current;
}
}
/*-----------------------------------------------------------------------*/
// 打印二维数组
void print_array(double **arr, int rows, int cols)
{
int i = 1;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
printf("%.2f ", arr[i][j]);
}
printf("\n");
}
}
/*-----------------------------------------------------------------------*/
int main()
{
// 示例二维数组
double data[][3] = {
{ 3.0, 2.0, 1.0 },
{ 1.0, 2.0, 3.0 },
{ 2.0, 3.0, 1.0 },
{ 1.0, 2.0, 2.0 }
};
int rows = 4;
int cols = 3;
// 将二维数组转换为指针数组
double *arr[4];
for (int i = 0; i < rows; i++)
{
arr[i] = data[i];
}
// 排序前
printf("Before sorting:\n");
print_array(arr, rows, cols);
// 排序
insertion_sort(arr, rows, cols);
// 排序后
printf("\nAfter sorting:\n");
print_array(arr, rows, cols);
return 0;
}
/*-----------------------------------------------------------------------*/
#include <stdio.h>
#include <stdbool.h>
// 比较两个子数组的大小
bool is_greater(double *a, double *b, int cols)
{
for (int i = 0; i < cols; i++)
{
if (a[i] > b[i])
{
return true;
}
else if (a[i] < b[i])
{
return false;
}
}
return false; // 如果所有元素都相等,返回 false
}
// 插入排序函数
void insertion_sort(double **arr, int rows, int cols)
{
for (int i = 1; i < rows; i++)
{
double *current = arr[i];
int j = i - 1;
// 将当前子数组插入到正确位置
while (j >= 0 && is_greater(arr[j], current, cols))
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = current;
}
}
// 打印二维数组
void print_array(double **arr, int rows, int cols)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%.2f ", arr[i][j]);
}
printf("\n");
}
}
int main() {
// 示例二维数组
double data[][3] = {
{ 3.0, 2.0, 1.0 },
{ 1.0, 2.0, 3.0 },
{ 2.0, 3.0, 1.0 },
{ 1.0, 2.0, 2.0 }
};
int rows = 4;
int cols = 3;
// 将二维数组转换为指针数组
double *arr[4];
for (int i = 0; i < rows; i++)
{
arr[i] = data[i];
}
// 排序前
printf("Before sorting:\n");
print_array(arr, rows, cols);
// 排序
insertion_sort(arr, rows, cols);
// 排序后
printf("\nAfter sorting:\n");
print_array(arr, rows, cols);
return 0;
}
代码说明:
1. `is_greater` 函数:
- 用于比较两个子数组的大小。
- 从第一个元素开始比较,如果 `a[i] > b[i]`,返回 `true`;如果 `a[i] < b[i]`,返回 `false`;如果所有元素都相等,返回 `false`。
2. `insertion_sort` 函数:
- 实现插入排序算法。
- 遍历数组,将每个子数组插入到已排序部分的正确位置。
3. `print_array` 函数:
- 用于打印二维数组的内容。
4. `main` 函数:
- 初始化一个示例二维数组。
- 调用 `insertion_sort` 函数进行排序。
- 打印排序前后的数组。