初学提问(请帮忙)

hujiusheng 2009-03-15 09:07:01
#include <iostream.h>
const int max=20;
class numset
{
int count;
int a[max];
public:
numset() {count=0;}
void addnum(int n)
{
int i=0,j;
while (i<count && n>=a[i]) i++;
if (n==a[i-1]) return;
for (j=count;j>=i;j--) {a[j+1]=a[j];}
a[i]=n;
count++;
}
void disp()
{
for (int i=0;i<count;i++ )
cout <<"a[i]="<<a[i]<<endl;
}
};
void main()
{
numset set;
set.addnum(1);
set.addnum(9);
set.addnum(5);
set.addnum(9);
set.disp();
}



大家帮我分析下。。。它是怎么样大小排序的。addnum这个函数一直都没有理解。。郁闷两天了所以在这里请教
...全文
128 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liwenchao0309 2009-03-16
  • 打赏
  • 举报
回复
学习了!
h13826013646 2009-03-16
  • 打赏
  • 举报
回复
插入排序,学习一下算法先
ysysbaobei 2009-03-16
  • 打赏
  • 举报
回复
pengzhixi 2009-03-15
  • 打赏
  • 举报
回复
插入排序。简单的原理就是:在前面排好的元素里面插入一个新元素,插入的新元素和前面的元素做比较找到合适的位置放进去。
sjhui19840325 2009-03-15
  • 打赏
  • 举报
回复

#include <iostream.h>

const int max=20;
class numset
{
int count; //已经插入到数组中整数的数目
int a[max]; //数组最好初始化
public:
numset() {count=0;}
void addnum(int n)
{
int i=0,j;
while (i <count && n>=a[i]) //从按从小到大排序的数组中寻找n值得插入位置
i++;
if (n==a[i-1]) // 如果要插入数值==数组中已有的值,则不进行插入
// **当插入第一个数时,此处会出现a[-1],可能出现bug
return;
for (j=count;j>=i;j--) //移动数组中大于n的数后移,空出位置i
{
a[j+1]=a[j];
}
a[i]=n; //在空出的位置上 插入n
count++; //数组中整数数目加1
}
void disp()
{
for (int i=0;i <count;i++ )
cout <<"a[i]=" <<a[i] <<endl;
}
};

void main()
{
numset set;
set.addnum(1);
set.addnum(9);
set.addnum(5);
set.addnum(9);
set.disp();
}

  • 打赏
  • 举报
回复
mark先
chin_chen 2009-03-15
  • 打赏
  • 举报
回复
插入排序,看看数据结构的关于这个的章节内容吧
tangshuiling 2009-03-15
  • 打赏
  • 举报
回复

从简单的做起,一步一步分析解决问题!
把所有的变量所表示的意义,以及变量值的变化过程搞明白就清楚了。
说实在的,这种代码我个人一般懒的看,变量没有命名规则且没有任何注释,不建议初学者看这种代码
容易误入歧途!
下面是改的,加了一点注释,看楼主能否看明白:
#include <iostream>
using namespace std;
const int MAX=20;
class Cont
{
int count; //记录插入数组array元素的个数
int array[MAX]; //容纳元素的数组,最大可容纳MAX个元素
public:
Cont():count(0) {} //Cont刚构造对象时,数组中时没有元素的
void SortInsert(int digital) //必须调用这个函数插入元素,元素
//重复就不会插入排序了
{
int i,j;
for(i=0;i<count;) //从数组下标为0的位置找
{
if(digital>=array[i]) ++i; //遍历数组,查找digital
//应该安插在什么位置
else break;
}
// while (i<count&&digital>=array[i]) i++;
if (digital==array[i-1]) return; //如果传入的数值与数组的最后
//一个值相等,直接返回,不做插入操作,等于排除了插入相等的情况
for (j=count;j>=i;j--) {array[j+1]=array[j];}
//此循环中的i已经标示了digital应该插入的位置,因此,从数组尾部开始
//到i的位置做元素移动,主要把i位置腾空留给digital
array[i]=digital; //看到没有i位置被digital占有了
count++; //最后别忘了数组元素加1
}
void disp()
{
for (int i=0;i <count;i++ )
cout <<"array[i]=" <<array[i] <<endl;
}
};
int main()
{
Cont set;
set.SortInsert(1);
set.SortInsert(9);
set.SortInsert(5);
set.SortInsert(9);
set.SortInsert(11);
set.disp();
return 0;
}
liusichen_0 2009-03-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 hujiusheng 的帖子:]

void addnum(int n)
{
int i=0,j;
while (i <count && n>=a[i]) i++; //从第一个开始找大于n的数
if (n==a[i-1]) return; // 如果是因为i>=count 退出 则返回
for (j=count;j>=i;j--) {a[j+1]=a[j];} // 把所有插入位置之后的元素移动到后面一个位置
a[i]=n; // 插入n
count++; // 计数+1
}
[/Quote]
lq651659889 2009-03-15
  • 打赏
  • 举报
回复
楼主是不是从大到小的排序啊!while (i <count && n>=a[i]) i++; 这句是在数组中找到小于等于n的数,if (n==a[i-1]) return; 这句楼主应该懂吧。for (j=count;j>=i;j--) {a[j+1]=a[j];}
a[i]=n;
这句就是吧a[i]后移一位,然后在a[i]出插入n;还有就是楼主要注意他的循环条件。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧