Icoding题解 线性表 数据调整
题干
顺序表 数据调整
已知顺序表L中的数据元素类型为int。设计算法将其调整为左右两部分,左边的元素(即排在前面的)均为奇数,右边所有元素(即排在后面的)均为偶数,并要求算法的时间复杂度为O(n),空间复杂度为O(1)。
函数原型如下:
void odd_even(SeqList *L);
相关定义如下:
1 2 3 4 5
| struct _seqlist{ ElemType elem[MAXSIZE]; int last; }; typedef struct _seqlist SeqList;
|
分析
对数组中的数据进行调整,左边的元素均为奇数,右边的均为偶数。经过一次遍历即可完成目标(时间复杂度的要求),而且不另外开辟一个数组(空间复杂度的要求)。
核心代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| void odd_even(SeqList *L) { int Start = 0; int End = L->last; ElemType Temp;
while (Start < End) { if (L->elem[Start] % 2 == 0 && L->elem[End] % 2 != 0) { Temp = L->elem[Start]; L->elem[Start] = L->elem[End]; L->elem[End] = Temp; Start++; End--; } else if (L->elem[Start] % 2 == 0 && L->elem[End] % 2 == 0) { End--; } else if (L->elem[Start] % 2 != 0 && L->elem[End] % 2 != 0) { Start++; } else { Start++; End--; } } }
|
完整代码
这段代码和上面带注释的有所不同,阅者不妨思考,以下方法虽然可以通过检测,但是否过于笨拙了?这段代码和上面的代码的区别在哪?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| void odd_even(SeqList *L) { ElemType temp; SeqList* SeqList = L; int i = 0; int rear = SeqList->last; while(i < rear){ if(SeqList->elem[i] % 2 != 0 && SeqList->elem[rear] % 2 == 0){ i++; rear--; } else if(SeqList->elem[i] % 2 == 0 && SeqList->elem[rear] % 2 != 0){ temp = SeqList->elem[i]; SeqList->elem[i] = SeqList->elem[rear]; SeqList->elem[rear] = temp; i++; rear--; } else if(SeqList->elem[i] % 2 == 0 && SeqList->elem[rear] % 2 == 0){ temp = SeqList->elem[rear - 1]; SeqList->elem[rear - 1] = SeqList->elem[i]; SeqList->elem[i] = temp; rear--; } else{ temp = SeqList->elem[i + 1]; SeqList->elem[i + 1] = SeqList->elem[rear]; SeqList->elem[rear] = temp; i++; } } }
|