要求将给定的数组进行归并,将数组中的0整合的数组的一侧,要求最高效。
方式一、用两个标志位high和low,用队尾同时开始扫描查找0,low标识位遍历完整个数组,high查找记录数组中不为0的数值个数。这样遍历之后,数组不为零数值顺序并没有发生改变。
#include <stdlib.h>
#include <stdio.h>
void move(int *a, int len)
{
int high=len-1, low=len-1;
for(; low >= 0; low--)
{
if(a[low] != 0) //low标识遍历整个数组
{
a[high] = a[low]; //如果数组值不为零,就将他保留
high--; //并且,high值减小,这样就可以用high记录零值的个数
}
}
for(;high>=0; high--)
{
a[high] = 0; //将剩下的数组值之间赋值为零
}
}
int main(void)
{
int i = 0;
int a[] = {10, 0, 9, 4, 0 ,8, 7, 0, 0, 1, 0};
int length = sizeof(a)/sizeof(int);
for(i = 0; i < sizeof(a)/sizeof(int) - 1; i++)
{
printf("%d ", a[i]);
}
printf("\n");
move(a, length); //调用mov