鱼C论坛

 找回密码
 立即注册
查看: 2888|回复: 10

关于数组排序问题

[复制链接]
发表于 2012-5-21 03:42:41 | 显示全部楼层 |阅读模式
1鱼币
关于谭老师书本p148页与p244页中的排序问题:

题目就是把数组a[10]中的十个元素从小到大排列.

书本第148页中,把十个数从小到大排序是这样的:

for(j = 0; j < 9; ++j)
{
  for(i = 0; i < 9 - j; ++i)
  {
    if( a[i] > a[i+1])
    {
      t = a[i];
      a[i] = a[i+1];
      a[i+1] = t;
    }
  }
}

而第244页中把十个数排序是这样的:

for(i = 0; i< 9; ++i)
{
  for(j = i+1; j < n; ++j)
  {
    k = i;
    if(a[j] < a[i])
        k = j;
       if(k!=i)
       {
         t = a[i];
         a[i] = a[k];
         a[k] = t;
       }
   }
}



请问,第244页的是什么算法? 书上说第148页是冒泡法.
我不明白第244页为什么要if(k!=i).
可不可以帮我说明一下第244页(即上面第二个例子)的每一个语句的意思?
我刚学不久,看不懂.
谢谢

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-5-21 03:45:37 | 显示全部楼层
为什么这两个例子的排序不一样? 我怎么感觉第二个例子好复杂,为什么不用冒泡法啊,
为什么还要有一个 k = i  和i if (k != i)..........:Q
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-21 12:52:14 | 显示全部楼层
#include<stdio.h>

void main()
{
        int i, j, t;
        int a[10] = {2,5,4,78,456,56,123,1,45,91};
       
        for( i = 0; i < 9; i++)
                for( j = i+1; j < 10; j++)
                {
                        if( a[i] > a[j])
                        {
                                 t = a[i];
                                 a[i] = a[j];
                                 a[j] = t;
                        }
                }

        for( i = 0; i < 10; i++)
        printf("%d\t" , a[i]);
}

第二种其实可以化简成这样;
其实都是一样的;
好好理解一下;
再不懂就单步调试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-21 22:24:27 | 显示全部楼层
第二种是快速排序撒
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 08:15:15 | 显示全部楼层

第二种不算是快速排序,快速排序需要一个固定的中枢元素将数组分成两段(第一段的最大值小于第二段的最小值)。之后调用递归实现。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 08:19:02 | 显示全部楼层
的确明白不了老谭的想法,至少这样的句子:(if(a[j] < a))我是不会写,既然读不懂可以先放放,因为人家是C语言的老油条了,写着写抽象的代码手到擒来,既然咱们还没达到这水平,就先记着到时回头再看。所以不能放弃学习C,因为放弃了你永远也不会知道老谭这代码想说什么了?  呵呵:lol
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 10:13:03 | 显示全部楼层
小飞侠 发表于 2012-5-22 08:15
第二种不算是快速排序,快速排序需要一个固定的中枢元素将数组分成两段(第一段的最大值小于第二段的最小 ...

看错了  是选择排序  谢谢你
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 11:40:08 | 显示全部楼层
[i][i]for(i = 0; i< 9; i++)
{
[/i][/i]
[i][i]  k = i;[/i][/i][i][i][i]
  for(j = i+1; j < n; j++)
  {
     if(a[j] < a[i][i])
        k = j;
       if(k!=i)
       {
         t = a[i][i];
         a[i] = a[k];
         a[k] = t;
       }
   }
}
[/i][/i][/i][/i][/i]


[i][i][i][/i][/i][/i]
我的书上(谭浩强第四版)是这样写的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-22 11:59:59 | 显示全部楼层
快速排序快速排序
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-5-23 19:17:27 | 显示全部楼层
819551413 发表于 2012-5-22 10:13
看错了  是选择排序  谢谢你

太客气了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-24 05:26:13 | 显示全部楼层
我明白了,谢谢大家,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-13 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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