标签:
一个整型数组,姑且将所有元素都设置为正整数,例如{1,2,3,4,5,6,7,8,9,10}现在要求将数组中的奇数放置到数组前面部分,偶数放置到数组的后面部分,应该怎么做呢?这个小编程题并不算难,很容易能够想到思路,我的第一种思路是这样:将数组拷贝一份,遍历拷贝的数组,奇数放到原数组前面部分,从下标0开始,偶数放到原数组后面部分,从最大下标开始,代码如下:
void sort(int *arr, int sz) //指向数组的指针和数组大小 { int *arr2=(int *)malloc(sz*sizeof(int)); //定义一个数组存放原有的数组元素 int count1 = 0; int count2 = sz-1; assert(arr); memcpy(arr2, arr, sizeof(int)*sz); //数组拷贝 for (int j = 0; j < sz; j++) //遍历数组 { if (arr2[j] % 2 == 1) { arr[count1] = arr2[j]; count1++; } else if (arr2[j] % 2 == 0) { arr[count2] = arr2[j]; count2--; } } }
这是我最先想到的方法,验证能够实现所需的功能,但存在缺点:需要开辟一定的空间,如果数组很大,这对内存是否够用来说存在一定问题,效率上也存在一定问题,那么我们可以改进一下,设定一个临时变量来交换奇数和偶数,代码如下:
void sort(int *arr, int sz) { int a = 0; int count = sz-1; assert(arr); for (int i = 0; i < sz; i++) { if (arr[i] % 2 == 1) //当前下标所指数为奇数,不做处理,进行下一次循环 { ; } else if (arr[i] % 2 == 0) //当前下标所指数为偶数,将其与count下标所指元素进行交换,下标做一定处理 { a = arr[count]; arr[count] = arr[i]; arr[i] = a; count--; i--; } if ((i+1) == count) //每一个元素都进行了判断,跳出循环 { break; } } }这样的代码解决了内存的问题,但效率上似乎还是一样的,可以进一步优化,设定两个整形指针分别指向数组的第一个元素和最后一个元素,姑且称为左指针和右指针,若左指针所指的元素为奇数,那么指针后移,直到指针指向一个偶数停下,若右指针所指元素为偶数,那么指针前移,直到找到一个奇数,如果此时左指针小于有指针,那么让两个指针所指内容交换,循环起来直到两个指针相遇,就达到了我们想要的结果。代码如下:
void sort(int *arr, int sz) //指向数组的指针和数组大小 { int *left = &arr[0]; //左指针 int *right = &arr[sz - 1]; //右指针 assert(arr); while (left < right) { while ((*left )% 2 == 1) { left++; } while ((*right) % 2 == 0) { right--; } if (left < right) { int tmp = *left; *left = *right; *right = tmp; } } }这样一来效率似乎提高了不少。
标签:
原文地址:http://blog.csdn.net/korey_sparks/article/details/51348296