使用C语言编写一个高效算法,将一顺序存储的线性表(设元素均为整形量)中所有零元素向表尾集中,其他元素则顺序向表头方向集中.
//第一种方法:从前向后扫描,见到0元素先计数,再将后续一个非零元素向前移并继续扫描,
//全部扫描完成后把后续部分清零,长度为0元素的计数值
//时间复杂度O(n)
void sort1(int *num,int length){
int i,j=0;
int count=0;
int n=length;
for(i=0;i<length;i++){
if(num[i]!=0){
num[j]=num[i];
j++;//遇到非零值则利用j下标才移动,0元素则不移动,把i下标遇到的非零值前移给num[j]
}
else{
count++;
}
}
for(i=n-count;i<n;i++){//填入0
num[i]=0;
}
}
//第二种方法:从前往后扫描,见到0元素则与尾部非0元素互换。
void sort2(int *num,int length){
int i,j=0;
int temp;
while(i<length){
temp=num[i];
num[i++]=0;
if(temp){//temp非0
num[j++]=temp;
}
}
}