#include<stdio.h>
#define MAXSIZE 20
typedef int elemtype;
typedef struct {
elemtype data[MAXSIZE];
int length;
}sqlist;
//初始化
void initlist(sqlist* L,elemtype a[],int n) {
int i = 0;
for (; i < n; i++)
L->data[i] = a[i];
L->length = n;
}
//输出
void displist(sqlist* L) {
for (int i = 0; i < L->length; i++)
printf("%d", L->data[i]);
printf("\n");
}
void swap(int& x, int& y) {
int t;
t = x;
x = y;
y = t;
}
//奇移到偶之前
//元素交换法
void partition1(sqlist* L) {
int i = 0,j=L->length-1;
while (i < j) {
while (i < j && L->data[i] % 2 == 1)
i++;
while (i < j && L->data[j] % 2 == 0)
j--;
if (i < j)
swap(L->data[i], L->data[j]);
}
}//解析见前一篇文章
//区间划分法
void partition2(sqlist* L) {
int i = -1, j;
//假设一共有i+1个奇数,用L-->data[0~i]表示存放奇数的奇数空间,起始i=-1代表区间为空
for (j = 0; j <=L->length - 1; j++) {
//从左向右遍历
if (L->data[j] % 2 == 1) { //若为奇数
i++; //奇数增加一员
if (i != j) //i=j意味着目前还未出现偶数,不执行下一步
swap(L->data[i], L->data[j]);//交换位置
}
//eg.2353633
//j=0,2,偶,不执行if之后
//j=1,3,奇,奇数+1,i=0,0!=1, 交换,3253633
//j=2,5,奇,奇数+1,i=1,1!=2,交换,3523633
//j=3, 3,奇,奇数+1,i=2,2!=3,交换,3532633
//j=4, 6,偶
//j=5, 3,奇,奇数+1,i=3,3! =5, 交换,3533623
//效果上,j用于寻找奇数,i记录的是最靠前的偶数的下标
//i=-1为起始,若直到第n+1个数才出现偶数,前n个数全是奇数,则i=n-1,为偶数下标
//若data[0]处就出现偶数,之后每出现一个奇数,奇数个数i+1,由于交换,偶数的下标也+1
}
}
int main() {
sqlist L;
elemtype a[MAXSIZE] = {2,3,5,3,6,3,3};
initlist(&L, a, 7);
displist(&L);
partition1(&L);
displist(&L);
partition2(&L);
displist(&L);
return 0;
}
方法参照“十二五”大学教材,数据结构教程第六版(清华大学出版社)