还在为二维数组排序发愁?一篇文章带你打通任督二脉
一、先看场景:三条生产线,谁最优秀?
二、核心思想:整行交换,数据“连体婴”
ranking[0] = {1, 0.86} // 产线1,得分0.86ranking[1] = {2, 0.74} // 产线2,得分0.74ranking[2] = {3, 0.92} // 产线3,得分0.92
每行代表一个对象(产线) 第0列存编号,第1列存得分
三、冒泡排序回顾:相邻比较,不断冒泡
第1轮:70和20比较 → 不动;20和80比较 → 交换 → [70,80,20,60,50];20和60比较 → 交换 → [70,80,60,20,50];20和50比较 → 交换 → [70,80,60,50,20](最小值20沉底) 第2轮、第3轮……直到完全有序。
四、结合二维数组:如何交换整行?
// 假设 ranking[3][2] 已存好数据int n = 3; // 3行for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {// 降序:如果前一行得分 < 后一行得分,交换if (ranking[j][1] < ranking[j+1][1]) {// 交换整行(两个元素:编号和得分)double temp[2];temp[0] = ranking[j][0];temp[1] = ranking[j][1];ranking[j][0] = ranking[j+1][0];ranking[j][1] = ranking[j+1][1];ranking[j+1][0] = temp[0];ranking[j+1][1] = temp[1];}}}
五、完整实战代码(可直接运行)
#include<stdio.h>#include<math.h>intmain(){// 原始统计结果:每行[平均直径, 准确度, 精确度]double stats[3][3] = {{2.31, 0.01, 0.08},{2.28, 0.02, 0.12},{2.32, 0.02, 0.06}};// 存放[产线编号, 综合得分]double ranking[3][2];// 权重double w_accuracy = 0.6;double w_precision = 0.4;double std_value = 2.3; // 标准值double ref_precision = 1.0; // 参考标准差// 计算每条产线的综合得分for (int i = 0; i < 3; i++) {ranking[i][0] = i + 1; // 产线编号1,2,3double accuracy = stats[i][1];double precision = stats[i][2];// 归一化得分(越小越好转为越大越好)double acc_score = 1 - (accuracy / std_value);double pre_score = 1 - (precision / ref_precision);ranking[i][1] = w_accuracy * acc_score + w_precision * pre_score;}// 冒泡排序(降序,按得分)for (int i = 0; i < 2; i++) {for (int j = 0; j < 2 - i; j++) {if (ranking[j][1] < ranking[j+1][1]) {// 交换整行double temp[2];temp[0] = ranking[j][0];temp[1] = ranking[j][1];ranking[j][0] = ranking[j+1][0];ranking[j][1] = ranking[j+1][1];ranking[j+1][0] = temp[0];ranking[j+1][1] = temp[1];}}}// 输出排序结果printf("排名\t产线编号\t综合得分\n");for (int i = 0; i < 3; i++) {printf("%d\t%d\t\t%.3f\n", i+1, (int)ranking[i][0], ranking[i][1]);}return 0;}
