将顺序表中奇数全移到偶数之前(元素交交换法,区间划分法)

#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;
}

 

方法参照“十二五”大学教材,数据结构教程第六版(清华大学出版社)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值