c语言二维数组怎么排序?


目录

 1. 问题描述:

 2. 问题解析:

 3. 编写函数:

 输出示例:


 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` 函数进行排序。
   - 打印排序前后的数组。

 输出示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值