int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至后面

来源:互联网 发布:好一点的耳环品牌 知乎 编辑:程序博客网 时间:2024/05/17 20:27

int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A,int nSize),使A把0移至后面,非0整数移至数组前面并保持有序(按原来顺序),返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路) 

这是网友给的程序:

#include<iostream>#define nsize 18using 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 100int 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;}


他的算法基本思想是把非零的数和零互换,而我的主要是找出全部非零的数,然后直接放在数组前面,后面补零。我感觉他的算法效率更高些,比较好。

原创粉丝点击