鱼C论坛

 找回密码
 立即注册
查看: 3588|回复: 6

自编的二维数组排序,写成由小到大的程序但是输出相反了,求原因

[复制链接]
发表于 2012-2-13 15:17:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. /*
  2.         2012年2月13日14:20:52
  3.         二维数组的排序
  4.         采用方法:a[0][0]与其他每个数比较,然后a[0][1]在于其他数比,然后a[0][2]再与其他数比,以此类推

  5. */

  6. # include <stdio.h>

  7. int main(void)
  8. {
  9.         int a[3][4] = {
  10.                 {9, 85, 5, 65},
  11.                 {15,14, 7, 8},
  12.                 {1, 3,  19,92}
  13.         };
  14.         int x, y;
  15.         int i, j;
  16.         int t;

  17.         for(i=0; i<3; ++i)
  18.         {
  19.                 for(j=0; j<4; ++j)
  20.                 {
  21.                         for(x=0; x<3; ++x)
  22.                         {
  23.                                 for(y=0; y<4; ++y)
  24.                                 {
  25.                                        //这里我改成if(a[i][j] < a[x][y]),就是由小到大的排序,但是原因不懂。
  26.                                         if(a[i][j] > a[x][y])//为何结果却是由大到小排序了,而不是由小到大
  27.                                         {
  28.                                                 t = a[i][j];
  29.                                                 a[i][j] = a[x][y];
  30.                                                 a[x][y] = t;
  31.                                         }
  32.                                          //用于检测数据
  33.                                         //printf("%-5d %-5d\n", a[i][j], a[x][y]);
  34.                                 }               
  35.                         }
  36.                 }
  37.         }

  38. //输出结果
  39.         for(i=0; i<3; ++i)
  40.         {
  41.                 for(j=0; j<4; ++j)
  42.                         printf("%-5d", a[i][j]);
  43.                 printf("\n");
  44.         }


  45.         return 0;
  46. }
  47. /*
  48. 在VC++6.0的运算结果是:
  49. --------------------------------------
  50. 92   85   65   19
  51. 15   14   9     8
  52. 7     5    3     1
  53. -------------------------------------
  54. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-13 21:48:29 | 显示全部楼层
顶上去,求帮助!!1
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-14 09:08:04 | 显示全部楼层
x,y好像不能从0开始吧
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-14 11:24:03 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-14 11:38:20 | 显示全部楼层
xiezutao 发表于 2012-2-14 11:24
可以的,就是a00和a00自己比较一次。

你理解错了,如果x,y每次都从零开始
比如
1    85   9    65   
15   14   7    8   
5    3    19   92   
当 i=0,j=1,x=0,y=0,时,就会变为
85   1    9    65   
15   14   7    8   
5    3    19   92   
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-14 12:03:01 | 显示全部楼层
本帖最后由 wangyexin 于 2012-2-14 12:28 编辑

从另一个角度说,i,j每次都是最小的,而i,j最后一次是2,3所以最后一个肯定是最小的,而且每次都是i,j和x,y比较 x y每次从零开始,数越大就放的越前
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-14 21:29:18 | 显示全部楼层
不知道怎么说,你根据你程序的思路试数就能得到答案了,而且你的方法有很多不必要的操作,看下我的代码吧,希望对你有帮助!
  1. /*
  2.         2012年2月13日14:20:52
  3.         二维数组的排序
  4.         排序方法:冒泡排序
  5. */

  6. # include <stdio.h>

  7. int main(void)
  8. {
  9.         int a[3][4] = {
  10.                 {9, 85, 5, 65},
  11.                 {15,14, 7, 8},
  12.                 {1, 3,  19,92}
  13.         };

  14.         int i, j;
  15.        
  16.         /* ----- 冒泡排序 ----- */
  17.         for (i=0; i<3*4-1; i++) //循环次数
  18.         {
  19.                 for (j=0; j<3*4-i; j++) //一次排序,以下j/4表示行, j%4表示列
  20.                 {
  21.                         if ( !(0==i==j) ) //数组的第一行第一列元素不执行
  22.                         {
  23.                                 if (0 != j%4) //每一列第一个元素执行else
  24.                                 {
  25.                                         //排序最大值
  26.                                         if (a[j/4][j%4-1] > a[j/4][j%4])
  27.                                         {
  28.                                                 //交换两个元素的值,用异或位运算实现
  29.                                                 a[j/4][j%4-1] ^= a[j/4][j%4];
  30.                                                 a[j/4][j%4] ^= a[j/4][j%4-1];
  31.                                                 a[j/4][j%4-1] ^= a[j/4][j%4];
  32.                                         }
  33.                                 }
  34.                                 else
  35.                                 {
  36.                                         if (a[j/4-1][4-1] > a[j/4][j%4])
  37.                                         {
  38.                                                 a[j/4-1][4-1] ^= a[j/4][j%4];
  39.                                                 a[j/4][j%4] ^= a[j/4-1][4-1];
  40.                                                 a[j/4-1][4-1] ^= a[j/4][j%4];
  41.                                         }
  42.                                 }
  43.                         }
  44.                 }
  45.         }
  46.        
  47.         //输出结果
  48.         for(i=0; i<3; i++)
  49.         {
  50.                 for(j=0; j<4; j++)
  51.                 {
  52.                         printf("%-5d", a[i][j]);
  53.                 }

  54.                 printf("\n");
  55.         }
  56.        
  57.        
  58.         return 0;
  59. }

  60. /*
  61. 在VC++6.0的运算结果是:
  62. --------------------------------------
  63. 1    3    5    7
  64. 8    9    14   15
  65. 19   65   85   92
  66. -------------------------------------
  67. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-11 07:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表