从前往后找所要交换的两个数
void ReOrder(int* arr, int size) { if (arr == NULL || size <= 1)return; int i = 0,j = 0; while (i < size&&j < size){ while (i < size && ((arr[i] & 0x01) == 1)){//找偶数 ++i; } while (j < size && ((arr[j] & 0x01) == 0)){//找奇数 ++j; } if (i < size&&j < size){ if (i < j)//保证所找到的奇数在偶数的后面才进行交换 swap(arr[i], arr[j]); else//否则继续找下一个奇数 ++j; } } }
扩展性代码
只需要根据不同的需求实现solution()方法即可,_ReorderOddEven()函数可以被复用
//奇数放到偶数前面 bool solution(int n) { if ((n & 0x01) == 0)//n是偶数 return false; else return true; } //负数在非负数前面 bool solution2(int n) { if (n < 0) return true; else return false; } //能被3整除的在前面,不能被3整除的数在后面 bool solution3(int n) { if (n % 3 == 0) return true; else return false; } void _ReorderOddEven(int* arr, int size, bool(*Fun)(int)) { int* start = arr; int* end = start + size - 1; while (start < end){ while (start < end && Fun(*start)){ ++start; } while (start < end && !Fun(*end)){ --end; } if (start < end){ swap(*start, *end); ++start, --end; } } } void ReorderOddEven(int* arr, int size) { if (arr == NULL || size <= 1)return; bool(*fun)(int); fun = &solution; _ReorderOddEven(arr, size,fun); } void ReorderOddEven2(int* arr, int size) { if (arr == NULL || size <= 1)return; bool(*fun)(int); fun = &solution2; _ReorderOddEven(arr, size, fun); } void ReorderOddEven3(int* arr, int size) { if (arr == NULL || size <= 1)return; bool(*fun)(int); fun = &solution3; _ReorderOddEven(arr, size, fun); } int main() { /*int arr[] = { 1, 2, 3, 4, 5, 6, 20, 7, 19, 99, 100, 101 }; ReorderOddEven(arr, sizeof(arr) / sizeof(arr[0])); for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i){ cout << arr[i] << " "; }*/ /*int arr2[] = { -1, -5, 3, 7, 29, -4, 0, 98, -5 }; ReorderOddEven2(arr2, sizeof(arr2) / sizeof(arr2[0])); for (int i = 0; i < sizeof(arr2) / sizeof(arr2[0]); ++i){ cout << arr2[i] << " "; }*/ int arr3[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; ReorderOddEven3(arr3, sizeof(arr3) / sizeof(arr3[0])); for (int i = 0; i < sizeof(arr3) / sizeof(arr3[0]); ++i){ cout << arr3[i] << " "; } system("pause"); }
《完》
时间: 2024-10-01 02:27:44