int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A,int nSize),使A把0移至后面,非0整数移至数组前面并保持有序(按原来顺序),返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
这是网友给的程序:
#include<iostream>
#define nsize 18
using namespace std;
int func(int *A,int Nsize);
int func(int *A,int Nsize)
{
int i,k,t=1,flag=0;
for(i=0;i<Nsize-1;i++)
{
if(A[i]==0&&flag==0)
{
k=i;//记录第一个零的下标
flag=1;
}
if(A[i]==0&&A[i+1]!=0)
{
A[i+1-t]=A[i+1];
A[i+1]=0;
}
else if(A[i]==0&&A[i+1]==0)
{
t++;//记录0的个数
}
}
return k;
}
int main()
{
int a[nsize]={1,2,3,4,0,5,7,0,7,5,3,2,0,234,3,0,2,4};
cout<<func(a,nsize)<<endl;
for(int i=0;i<nsize;i++)
cout<<a[i]<<" ";
return 0;
}
这是我写的程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 100
int Func(int *A,int nSize)
{
int i,j,count=0,flag;
int *ptr,*p1;
p1=(int *)malloc(sizeof(int)*nSize);
ptr=A;
for(i=0;i<nSize;i++)
{
if(0==*(ptr+i))
{
flag=i;
break;
}
}
for(i=0;i<nSize;i++)
{
if(*(ptr+i)!=0)
{
*(p1+count)=*(ptr+i);
count++;
}
}
for(j=count;j<nSize;j++)
{
*(p1+j)=0;
}
for(i=0;i<nSize;i++)
{
*(A+i)=*(p1+i);
}
free(p1);
return flag;
}
int main()
{
int A[MAXLEN],n,i,flag0;
printf("Please input the length of array A(n):");
scanf("%d",&n);
printf("Please input %d numbers:",n);
for(i=0;i<n;i++)
{
scanf("%d",&A[i]);
}
flag0=Func(A,n);
printf("%d\n",flag0);
printf("The sorted numbers are:");
for(i=0;i<n;i++)
{
printf("%d ",A[i]);
}
printf("\n");
return 1;
}
他的算法基本思想是把非零的数和零互换,而我的主要是找出全部非零的数,然后直接放在数组前面,后面补零。我感觉他的算法效率更高些,比较好。