我写的双向冒泡为什么不能正确排序?

HNLGDXYJS 2008-10-02 09:40:40
请大家帮我看一下,看一下是设计问题,还是算法问题.我产生的随机数根本没有排序,还是照原样输出..谢谢大家.


#include<iostream>
#include<ctime>
using namespace std;
const int MAXSIZE = 100;
#define Swap(i,j) {int s = (i); (i) = (j); (j) = s;}
class Sort
{
int array[MAXSIZE];
//int length;
public:
Sort();
void Display();
void Bubble_Sort(int n);
};
////////////////////////////////////////////////
Sort::Sort()
{
srand(unsigned(time(NULL)));
for (int i=0;i<=MAXSIZE-1;i++)
array[i] = rand()%10000;
}
void Sort::Display()
{
for (int i=0;i<=MAXSIZE-1;i++)
{
cout<<array[i]<<" ";
if ((i+1)%10 == 0)cout<<endl;
}
}
void Sort::Bubble_Sort(int n)
{
cout<<"Bubble_Sort:"<<endl;
int change = 1;
int low = 0,high = n-1;
while ((low<high) && change)
{
change = 0;
for (int i=low;i<high;i++) //从上到下冒泡
if (array[i]>array[i+1]) {Swap(array[i],array[i+1]);change = 1;}
high--;
for (int j=high;j>low;j--) //从下向上冒泡
if (array[j]<array[j+1]) {Swap(array[j],array[j+1]);change = 1;}
low++;
}
}
int main(void)
{
Sort Sort_Object;
Sort_Object.Bubble_Sort(MAXSIZE-1);
Sort_Object.Display();
getchar();
return 0;
}
...全文
75 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
HNLGDXYJS 2008-10-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 adriano119 的回复:]
LZ怎么把sort作为了一个类?
sort本身就是操作
[/Quote]
谢谢楼上两位了,这个问题算是基本解决..
用sort作类名切实不该,谢谢提醒...可惜帖子已结,我很快就会再问问题了,下次给分^_^
study_live 2008-10-02
  • 打赏
  • 举报
回复

void Sort::Bubble_Sort(int n)
{
cout<<"Bubble_Sort:"<<endl;
int change = 1;
int low = 0,high = n-1;
while ((low<high) && change)
{
change = 0;
for (int i=low;i<high;i++) //从上到下冒泡
if (array[i]>array[i+1]) {Swap(array[i],array[i+1]);change = 1;}
high--;
for (int j=high;j>low;j--) //从下向上冒泡
if (array[j]>array[j+1]) //这里应该用>, 你用错了
{
Swap(array[j],array[j+1]);change = 1;
}
low++;
}
}

adriano119 2008-10-02
  • 打赏
  • 举报
回复
LZ怎么把sort作为了一个类?
sort本身就是操作
HNLGDXYJS 2008-10-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Vegertar 的回复:]
C/C++ code
template<class T, int N>
Sort_Object.Merge_Sort(T (&arr)[N], int o, int n);
[/Quote]

非常感谢,我先试写一下..不行再上来问了..
谢谢大家..
HNLGDXYJS 2008-10-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 likefermat 的回复:]
找到了就给分,做人要厚道,不要打着高分的幌子,让别人为你义务劳动.
[/Quote]
谢谢提醒...
我很少发帖,发了也是我能给的最高分,100.
Vegertar 2008-10-02
  • 打赏
  • 举报
回复

template<class T, int N>
Sort_Object.Merge_Sort(T (&arr)[N], int o, int n);
Vegertar 2008-10-02
  • 打赏
  • 举报
回复
LZ,你三楼的代码还是不行,看看二楼的吧.你调用时是Sort_Object.Bubble_Sort(MAXSIZE-1);
函数体内就应该是n.
HNLGDXYJS 2008-10-02
  • 打赏
  • 举报
回复
嗯,没错,谢谢二楼,帮我找出原因...自已都晕了头了...呵呵 .
我如果想用类来写一个归并排序,该怎么设计好呢?
像我上面那种好像不行,因为我不知怎样传递数组...数组是一个类数据成员,在main()中怎样调用归并排序好呢?

像这样:

Sort_Object.Merge_Sort(int arr;int o,int n);// 这里的arr就像我上面定义的那样,
//是个类数据成员,该怎样设计呢?谢谢...
likefermat 2008-10-02
  • 打赏
  • 举报
回复
找到了就给分,做人要厚道,不要打着高分的幌子,让别人为你义务劳动.
HNLGDXYJS 2008-10-02
  • 打赏
  • 举报
回复
谢谢一楼,我找到原因了

void Sort::Bubble_Sort(int n)
{
cout<<"Bubble_Sort:"<<endl;
int change = 1;
int low = 0,high = n-1;
while ((low<high) && change)
{
change = 0;
for (int i=low;i<high;i++) //从上到下冒泡(没考虑边界元素,改为i<=high)
if (array[i]>array[i+1]) {Swap(array[i],array[i+1]);change = 1;}
high--;
for (int j=high;j>low;j--) //从下向上冒泡(同上,改为j>=low)
//下面的array[j+1]改为array[j-1]就行了...
if (array[j]<array[j+1]) {Swap(array[j],array[j+1]);change = 1;}
low++;
}
}

jia_xiaoxin 2008-10-02
  • 打赏
  • 举报
回复
问题出在两个地方:

#include<iostream>
#include<ctime>
using namespace std;
const int MAXSIZE = 100;
#define Swap(i,j) {int s = (i); (i) = (j); (j) = s;}
class Sort
{
int array[MAXSIZE];
//int length;
public:
Sort();
void Display();
void Bubble_Sort(int n);
};
////////////////////////////////////////////////
Sort::Sort()
{
srand(unsigned(time(NULL)));
for (int i=0;i<=MAXSIZE-1;i++)
array[i] = rand()%10000;
}
void Sort::Display()
{
for (int i=0;i<=MAXSIZE-1;i++)
{
cout<<array[i]<<" ";
if ((i+1)%10 == 0)cout<<endl;
}
}
void Sort::Bubble_Sort(int n)
{
cout<<"Bubble_Sort:"<<endl;
int change = 1;
int low = 0,high = n;//这个地方因该为n
while ((low<high) && change)
{
change = 0;
for (int i=low;i<high;i++) //从上到下冒泡
if (array[i]>array[i+1]) {Swap(array[i],array[i+1]);change = 1;}
high--;

for (int j=high;j>low;j--) //从下向上冒泡
if (array[j]<array[j-1]) {Swap(array[j],array[j-1]);change = 1;}//冒泡的方向反了。
low++;

}
}
int main(void)
{
Sort Sort_Object;
Sort_Object.Bubble_Sort(MAXSIZE-1);
Sort_Object.Display();
getchar();
return 0;
}
study_live 2008-10-02
  • 打赏
  • 举报
回复

#include <iostream.h>
void Bubble2Sort(int* pData,int Count)
{
int iTemp;
int left = 1;
int right =Count -1;
int t;
do
{
//正向的部分
for(int i=right;i>=left;i--)
{
if(pData[i]<pData[i-1])
{
iTemp = pData[i];
pData[i] = pData[i-1];
pData[i-1] = iTemp;
t = i;
}
}
left = t+1;

//反向的部分
for(i=left;i<right+1;i++)
{
if(pData[i]<pData[i-1])
{
iTemp = pData[i];
pData[i] = pData[i-1];
pData[i-1] = iTemp;
t = i;
}
}
right = t-1;
}while(left<=right);
}

void main()
{
int data[] = {10,9,8,7,6,5,4};
Bubble2Sort(data,7);
for (int i=0;i<7;i++)
cout<<data[i]<<" ";
cout<<"\n";
}


看看这个例子

64,654

社区成员

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

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