标题:[求助]排序算法出了点问题
只看楼主
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
以下是引用mahayu在2007-8-5 8:57:43的发言:

更正一下原先代码中的错误
#include <stdio.h>
void main()
{
int a[10]={1,34,3,123,12,56,2,41,9,10};
int j,i,tm;

for(j=9;j>0;j--)
{
for(i=0;i<j;i++)
{
if(a[i]>a[j]) //if语句用来比较两数大小,当a[i]>a[j]时,为升序排列,反之a[i]<a[j]时为降序排列
{
tm=a[i];
a[i]=a[j];
a[j]=tm;
}
}
}

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

这是数组的冒泡排序法

这可不是冒泡排序,只能算一个有缺陷的选择排序。


Fight  to win  or  die...
2007-08-05 10:53
mahayu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:122
专家分:160
注 册:2007-8-3
得分:0 
这可不是冒泡排序,只能算一个有缺陷的选择排序。
请教版主,指点迷津,我是初学者,给点指示先.

研究Java和C#,,Jsp,Sql等各类编程技术, QQ:442013799  QQ群:47934757
2007-08-06 09:48
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
以下是引用mahayu在2007-8-6 9:48:44的发言:
这可不是冒泡排序,只能算一个有缺陷的选择排序。
请教版主,指点迷津,我是初学者,给点指示先.

选择排序:
A[1,2..i..n](i <- 1 to n)
在一次循环开始前,子数组A[1..i-1]总是已排序的,从i位置开始,在子数组A[i+1..n]中找出最小值A[min],与A[i]交换。

冒泡排序:
A[1,2..i..n](i <- 1 to n)
在一次循环开始前,子数组A[n-i+1..n]总是已排序的,从1位置开始,在子数组A[1..n-i]中,逐次比较相邻两值,若前着大于(升序)后者,交换之。这个过程类似从下往上冒泡泡,总把最大的数推到n-i位置。

以上是两个排序算法的 “循环不变式” 描述,仔细看就能理解其中异同。

在选择排序算法中,“从i位置开始,在子数组A[i+1..n]中找出最小值A[min]”,可知min仅仅是保存一个最小值的坐标,只需要在一次循环结束后交换;而在上面的题目中,min保存最小值元素,每次更新都会做一次交换。所以我说它有缺陷。


Fight  to win  or  die...
2007-08-06 16:10
xieyuanchang
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2007-8-5
得分:0 
#include<stdio.h>
void main()
{
int num[5];
int temp;
printf("请输入5个数字: ");
for(int k=0;k<5;k++)
{
scanf("%d",&num[k]);
}
for(int i=0;i<4;i++)
{
for(int j=0;j<4-i;j++)
{
{
if (num[j]<num[j+1])
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
}
}
for(int m=0;m<5;m++)
{
printf("%d  ",num[m]);//这里最好有空格
}
}
打扰下,修改楼主的程序,好象我改的这个才是冒泡吧,关键处为红色部分

2007-08-07 03:11
不在犯罪现场
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-8-1
得分:0 
那请问楼主我的算不算??

2007-08-07 05:08
mahayu
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:122
专家分:160
注 册:2007-8-3
得分:0 
呵呵,歪打正着,效果虽然一样,思路偏了,谢谢楼主指点.

研究Java和C#,,Jsp,Sql等各类编程技术, QQ:442013799  QQ群:47934757
2007-08-07 08:31
lijy520
Rank: 2
等 级:论坛游民
帖 子:119
专家分:42
注 册:2007-8-8
得分:0 
以下是引用不在犯罪现场在2007-8-5 1:05:03的发言:
void main()
{
int a[5];
int temp;
printf("请输入5个数字: ");
for(int i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
for(int j=4;j>0;j--)
for(int k=0;k<j;k++)
{
if(a[k]>a[k+1])
{
temp=a[k];
a[k]=a[k+1];
a[k+1]=temp;
}
}
for(int m=0;m<5;m++)
{
printf("%d",a[m]);
}

}
不知道这样能不能排出来。。。

应该是选择吧
此程序选择最大的向后冒
冒泡我向应该是一个值一直的向后去比较
然后插入


2007-08-08 22:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-160112-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.088156 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved