算法问题:输入一个整数的数组,实现一个函数来调整该数组中数字的顺序,使得所有的
奇数位于数组的前半部分,所有的偶数位于数组的后半部分。
该问题在耿国华《数据结构》中有,但讲的很粗糙。而且在面试的时候这个问题也常出现,
上次我去面百度的暑假实习生的时候,百度的一面面试官就问了我这个问题。
----------------------------------------------------------------------------------------------------------------
一、算法问题分析:
该问题可以用快速排序的思想,快速排序是将一个数组划分为两类,一类是大于区轴
一类是小于区轴,这个地方同样是将数组划分为两类,一类为奇数,一类为偶数。其算法的
实现和快速排序的实现也有很多相似的地方。
----------------------------------------------------------------------------------------------------------------
二、算法的实现。
-
#define swap(a,b) \
-
do {typeof(a) tmp = a;a = b;b = tmp;} while(0)
-
-
void adjust(int a[],int len)
-
{
-
if (a == NULL || len == 0)
-
return ;
-
int i = 0, j = len - 1;
-
while (i < j) {
-
while (i < j && (a[i] & 0x01)) i++;
-
while (i < j && (a[j] & 0x01) == 0) j--;
-
if (i < j) swap(a[i],a[j]);
-
}
-
return ;
-
}
-----------------------------------------------------------------------------------------------------
三、单元测试。
可以使用随机数进行测试。测试用例的思考要出现在编码前和编码后,编码前是
指导编码,编码后是验证,这样才能将写好的代码交付。
-
int main(void)
-
{
-
int a[10];
-
int i = 0;
-
int n = 100;
-
-
while (n--) {
-
printf("\nbefore adjust:\n");
-
for (i=0;i<10;i++) {
-
a[i] = random() % 100;
-
printf("%d ",a[i]);
-
}
-
adjust(a,10);
-
printf("\nafter adjust:\n");
-
for (i=0;i<10;i++) {
-
printf("%d ",a[i]);
-
}
-
putchar('\n');
-
}
-
return 0;
-
}
-----------------------------------------------------------------------------------------------------------------
四、问题的扩展。
假如问题现在要改为把数组中的数按照大小分为两部分,所有的负数都放在非负数的前面。
或,把数组中的数分为两部分,能被3整除的数都放在不能被3整除数到前面。
其实,这些问题可以将其抽象下,就是他们的逻辑框架是一样的,将一个数组分为两部分,
只是判定的标准不一样。这样可以将判断的标准通过参数的形式传入到函数中,这种方式
在内核中比比皆是。
-
bool is_even(int x)
-
{
-
return (x & 0x01) == 1;
-
}
-
-
bool is_minus(int x)
-
{
-
if (x < 0)
-
return 1;
-
else
-
return 0;
-
}
-
-
-
void adjust(int a[],int len,bool (*judge)(int))
-
{
-
if (a == NULL || len == 0)
-
return ;
-
int i = 0, j = len - 1;
-
while (i < j) {
-
while (i < j && judge(a[i])) i++;
-
while (i < j && !judge(a[j])) j--;
-
if (i < j) swap(a[i],a[j]);
-
}
-
return ;
-
}
-------------------------------------------------------------------------------------------------------------
该编码的思想很经典,有让人为之一震的感觉,希望以后能培养出自己抽象问题的能力。
阅读(1800) | 评论(0) | 转发(0) |