整型数组int A[nSize],其中隐藏着若干个0,其余非0整数,写一个函数int Func(int *S,int size), 使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)。
1 #include<stdio.h> 2 #include<stdlib.h> 3 int Func(int a[],int size) 4 { 5 int temp;//用于交换数组的临时变量 6 int count1=0,count2=0;//用于统计0的个数 7 int first,first2;//用于记录元素0第一次出现的位置 8 int len=0,fu_first;//len用于遍历数组的变量,fu_first用于记录排序后第一个负数出现的位置 9 for(int i=0;i<size;i++) 10 { 11 { 12 if(a[i]==0) 13 { 14 count1++; 15 if(count1==1) 16 first=i; 17 }//判断第一个是否为0 18 for(int j=i+1;j<size;j++) 19 if(a[i]<a[j]) 20 { 21 if(a[j]==0) 22 { 23 count1++; 24 if(count1==1) 25 first=j; 26 } 27 temp=a[i]; 28 a[i]=a[j]; 29 a[j]=temp; 30 } 31 } 32 } 33 while(len<size) 34 { 35 if(a[len]==0) 36 { 37 count2++; 38 if(count2==1) 39 { 40 first2=len;//再找到排序后元素为0的第一个位置 41 } 42 } 43 if(a[len]<0) 44 { 45 fu_first=len;//找到排序好后,第一个元素是负数的位置 46 break; 47 } 48 len++; 49 } 50 for(int k1=0;k1<count2;k1++)//移的次数应该是根据0的个数 51 for(int k2=first2;k2<size-1;k2++) 52 a[k2]=a[k2+1];//数组往前移,找到第一个0的位置后,数组依次往前移 53 for(int k3=size-count2;k3<size;k3++) 54 a[k3]=0;//后面的赋值为0 55 return first; 56 } 57 int main() 58 { 59 int a[10]={9,5,3,1,-2,0,-4,6,0,-8}; 60 int result=Func(a,10); 61 printf("原数据中第一个元素为0的下标:%d\n",result); 62 for(int i=0;i<10;i++) 63 { 64 printf("%d",a[i]); 65 } 66 }
题目涉及到排序,对于不适用辅助空间,考虑效率问题还没有什么好的想法,只是简单地把题目的要求实现,知道还是不够好,不过现在目前还只能做成这样,以后不断改进吧。
来源:https://www.cnblogs.com/wj204/archive/2013/06/08/3125363.html