1、有一个顺序表L,假设元素类型ElemType为整型,设计一个尽可能高效的算法,以第一个元素为分界线(基准),将所有小于或等于它的元素移到该基准的前面,将所有大于它的元素移动到该基准的后面
解法一:元素交换法
以第一个元素为基准,从右向左找一个小于或等于基准的元素x,从左向右找一个大于基准的元素y,将两者交换,直到全部找完
cpp
//元素交换法(双指针)
void partition(SqList*& L) {
int i = 0 , j = L->length - 1;
ElemType base = L->data[0]; //以data[0]为基准
while (i < j) { //从区间的两端交替向中间遍历,直到i==j为止
while (i<j && L->data[j]>base) { //从右向左遍历,找一个小于或等于base的元素
j--;
}
while (i<j && L->data[i]<=base) { //从左向右遍历,找一个大于base的元素
i++;
}
if (i < j) {
swap(L->data[i], L->data[j]); //将L->data[i]和 L->data[j]交换
}
}
swap(L->data[0], L->data[i]); //将L->data[0]和 L->data[i]交换
}
解法二:覆盖法
cpp
//覆盖法
void partition2(SqList*& L) {
int i = 0, j = L->length - 1;
ElemType base = L->data[0]; //以data[0]为基准
while (i < j) { //从区间的两端交替向中间遍历,直到i==j为止
while (i<j && L->data[j]>base) { //从右向左遍历,找一个小于或等于base的data[j]
j--;
}
L->data[i] = L->data[j]; //找到这样的data[j],放到data[i]处
while (i < j && L->data[i] <= base) { //从左向右遍历,找一个大于base的data[i]
i++;
}
L->data[j] = L->data[i]; //找到这样的data[i],放到data[j]处
}
L->data[i] = base; //最后将base放在data[i]处
}
2、有一个顺序表L,假设元素类型ElemType为整型,设计一个尽可能高效的算法,将所有奇数移到偶数的前面
解法一:元素交换法
cpp
//元素交换法
void movel(SqList*& L) {
int i = 0, j = L->length - 1;
while (i < j) {
while (i < j && L->data[j] % 2 == 0) { //从右向左遍历,找一个奇数元素
j--;
}
while (i < j && L->data[i] % 2 == 1) { //从左向右遍历,找一个偶数元素
i++;
}
if (i < j) { //若i<j,将L->data[i]和L->data[j]交换
swap(L->data[i], L->data[j]);
}
}
}
解法二:区间划分法
cpp
//区间划分法
void move2(SqList*& L) {
int i = -1;
for (int j = 0; j < L->length; j++) {
if (L->data[j] % 2 == 1) { //j指向奇数时
i++; //奇数区间中的元素的个数加1
if (i != j) { //若i不等于j,将L->data[i]和 L->data[j]交换
swap(L->data[i], L->data[j]);
}
}
}
}