c语言高手指教下

juelang12 2009-09-22 10:30:53
/*将顺序表(a1,a2.....an)重新排列为以a1为界的两部分
a1前面的值均比a1后面的值小,后面的值均比a1大,这里假设数据元素的
类型具有可比性,不妨设为整型,这一操作成为划分,也成为基准*/
#define N 5
#include <stdio.h>
void main()
{
int i,j,temp,a[N];
printf("请输入数组a的值\n");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
for(j=0;j<N;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
for(i=0;i<N;i++)
printf("%d\t",a[i]);
}
/*这是用冒泡法做的,但是这种算法不好,我想到了一种新的
算法,就是用a1和后面的每个数进行比较,如果后面的数
小于a1,则将它排在紧靠a1前面的位置,例如,5 1 2,5与1比较,
1小于5,排成1 5 2,5再与2比较,2也小于5, 那么将2排在紧靠
5的前面,结果为:1 2 5,高手指教哈,帮我实现这种算法,用c语言*/
我是新手,谢谢高手,麻烦帮我变出来
...全文
248 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangxiansheng007 2009-09-24
  • 打赏
  • 举报
回复
我自己写的起泡排序如下

#define N 5
void fac(int a[],int n)
{ int i,j,t;
for(j=1;j<=n-1;j++)
for(i=0;i<=n-j+1;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
}


main()
{ int a[N],i;
printf("input array int num:\n");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
fac(a,N);
printf("the paixu is:\n");
for(i=0;i<N;i++)
printf("%d\t",a[i]);
}
juelang12 2009-09-24
  • 打赏
  • 举报
回复
#7楼
我的冒泡法就是错了,应该把for(j=0;j <N;j++) 改为for(j=0;j<n-i-1;j++)才对,

你写的代码,我看懂了,当执行完while的循环后,a[first]前面的数都比基准a[0]小,而从a[first]开始,后边的都比a[0]大,然后将a[0]和a[first-1]的值交换,但是我有点小疑问,你的那个 int tag = a[0] ; //记录第一个元素应该移动到的位置怎么感觉好像有么有都可以呢,而且你做的程序只是完成了基准a[0]前面的数都比基准a[0]小,后边的都比它大,但是还是么有完成我的算法呀,例如5 6 3 4 8 ,你的程序执行完后是3 4 5 6 8,而我希望的是4 3 5 6 8,我希望的是用a1和后面的每个数进行比较,如果后面的数小于a1,则将它排在紧靠a1前面的位置,不过已经很感谢你了
呵呵
wendll 2009-09-24
  • 打赏
  • 举报
回复
下面这才是冒泡排序,你那要是冒泡排序循环就不对
void BubbleSort(int* pData,int Count) 
{
  int iTemp;
  for(int i=1;i<Count;i++)
  {
   for(int j=Count-1;j>=i;j--)
    {
  if(pData[j]<pData[j-1])
   {
  iTemp = pData[j-1];
  pData[j-1] = pData[j];
  pData[j] = iTemp;
   }
   }
  }
}


关于你的题,我写了下代码,看不懂再和你解释
#define N 5
#include <stdio.h>
void main()
{
int i,j,temp,a[N];

printf("请输入数组a的值\n");
for(i=0;i <N;i++)
scanf("%d",&a[i]);

int tag = a[0] ; //记录第一个元素应该移动到的位置

int first = 1, rear = N-1 ;

//while循环里把a[0]后面的元素按a[0]划分为两部分
int t ;
while(first <= rear)
{
if(a[first] > a[0] && a[rear] <= a[0])
{
t = a[first] ;
a[first] = a[rear] ;
a[rear] = t;
first++;
rear-- ;
}
if(a[first] <= a[0])
first++ ;
if(a[rear] > a[0])
rear-- ;
}

//把a[0]的值和a[first-1]交换
if(first > 1)
{
t = a[first-1] ;
a[first-1] = a[0] ;
a[0] = t ;

}
for(i=0;i <N;i++)
printf("%d\t",a[i]);
}
bianhao06 2009-09-24
  • 打赏
  • 举报
回复
楼主的那个意思有点像快排啊!!
aopha 2009-09-23
  • 打赏
  • 举报
回复
楼主并不是要排序,只是要找到中间值。
但是貌似不排序又找不出中间值
juelang12 2009-09-23
  • 打赏
  • 举报
回复
这个应该就是冒泡算法,至于tag什么的,我听不懂,我是新手,呵呵

wendll 2009-09-23
  • 打赏
  • 举报
回复
这个是冒泡算法?貌似不是吧!

弄个tag保存a1的位置
O(n)的时间复杂度内估计能解决此问题
juelang12 2009-09-23
  • 打赏
  • 举报
回复

三楼似乎么有看懂我的意思,我的意思是以a1为基准,要求的结果是运行程序后,使a1前面的都小于a1,a1后面的都大于a1。
四楼,二楼,补充一句,如果被比较的数大于a1,那么这个数就保持原位置不变呀,
pigniyan 2009-09-23
  • 打赏
  • 举报
回复
楼主好像还没有讲清楚你到底要怎么样做,用5,1,2可以像你那样想,那如果一开始就是1,2,5呢,那怎么做呢,是停止了,还是换其它的数比较,你比较要定义清楚啊,如果碰到比作为比较数的大,那应该怎么办?
liao05050075 2009-09-22
  • 打赏
  • 举报
回复
那如果是 1 3 5 6 7 8 9 2
你想到的那个算法是怎么做的?

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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