鱼C论坛

 找回密码
 立即注册
查看: 4145|回复: 2

冒泡排序中,为什么正反序排列中,循环次数会不同呢? 求指导~~~

 关闭 [复制链接]
发表于 2011-6-19 16:42:22 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 小飞侠 于 2011-6-19 16:44 编辑

问题在代码的注释里(望大家帮助,很费解~~);
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void sort(int a[],int n, char style);

  4. int main()
  5. {
  6. int a[60] , i , count = 0 , number = 0;
  7. char style ;

  8. printf("\n请输入有多少人数(number<60):\n");
  9. scanf("%d" , &number);

  10. printf("\n请输入学生的分数 :\n");
  11. for(i = 0 ; i < number ; i++)
  12. scanf("%d" , &a[i]);

  13. printf("\n请问你希望怎样对成绩进行排列(a:升序 / d:降序):\n");
  14. scanf(" %c" , &style);//注意" %c" %c前得空格;

  15. sort(a , number , style);

  16. for(i = 0 ; i < number ; i++)
  17. {
  18. printf("%4d" , a[i]);
  19. }
  20. printf("\n");

  21. system("pause");
  22. }

  23. void sort(int a[] , int n , char style)
  24. {
  25. void ascending(int *p , int n);
  26. void descending(int *p , int n);


  27. if('d' == style)
  28. {
  29. descending(a , n);
  30. }

  31. else
  32. if('a' == style)
  33. {
  34. ascending(a , n);
  35. }

  36. else
  37. {
  38. printf("\n输入有误!!!....\n");
  39. }
  40. }

  41. void ascending(int *p , int n)
  42. {
  43. int i , j , temp;

  44. printf("\n好的!我们将按照 升序 将成绩进行排列:\n");

  45. for(i = 0 ; i < n ; i++)
  46. {
  47. for(j = 0 ; j < n-i-1 ; j++) //注意这里的j < n-i-1;只有这种情况是可行的;
  48. {
  49. if(*(p+j) > *(p+j+1))
  50. {
  51. temp = *(p+j);
  52. *(p+j) = *(p+j+1);
  53. *(p+j+1) = temp;
  54. }
  55. }
  56. }
  57. }

  58. void descending(int *p , int n)
  59. {
  60. int i , j , temp;
  61. printf("\n好的我们将按照 降序 将成绩进行排列:\n");

  62. for(i = 0 ; i < n ; i++)
  63. {
  64. for(j = 0 ; j <= n-i ; j++)//你会发现以下两种情况都是可行的:j<n-i & j<=n-i; 误解中求解答;
  65. {
  66. if(*(p+j) < *(p+j+1))
  67. {
  68. temp = *(p+j);
  69. *(p+j) = *(p+j+1);
  70. *(p+j+1) = temp;
  71. }
  72. }
  73. }
  74. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-19 18:32:42 | 显示全部楼层
本帖最后由 liao4155289 于 2011-6-19 18:33 编辑

冒泡排序实际就是每一次把最小的放在追后面。
比如说有4个数,a[0],a[1],a[2],a[3],n=4
第一次i=0,n-i = 4 ,即把前面4个数中最小的放在最后面。
在这次循环中(即i=0这个循环),最后一次比较应该是 a[2]和a[3],此时的j=n-i-1-1 = 2 也就是 j<n-i-1(而不是j<n-i,j<=n-i)

第二次i=1,n-i =3,    即把前面3个数中最小的放在最后面,即选出第二小的数放在a[2](因为a[3]已经是四个数中最小的了)
这个循环中,最后一次比较的应该是a[1]和a[2],    j=n-i-1  -1 = 1 , 也就是 j<n-i-1(而不是j<n-i,j<=n-i)


依次类推

所以只有  j<n-i-1 是对的。 而 j<n-i不行,因为 在第一次循环中,会访问到a[4],由于a[4]是一个不确定的值,通常是一个很小的负数。
所以就算  你写的是 j<n-i,  a[3]也会大于 a[4],同样不会交换它们的值。所以尽管写的是 j < i-1 & j<= i -1,在降序排序中结果是一样的。但是在升序中就不对了。你可以自己试试看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-19 22:29:48 | 显示全部楼层

谢谢回答,我好好研究下~~  祝开心快乐!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-7 02:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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