改进冒泡排序,试编写一个程序,对一个待排序的数据元素集合进行奇偶转换排序
奇偶排序是指第一趟对所有奇数的i,将a[i]与a[i+1]进行比较,第二趟是对所有偶数的i,将a[i]与 a[i+1]进行比较,每次比较时,若a[i]>a[i+1],则将二者交换,重复上述两趟交换进行的过程,直到整个数据表有序。
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
typedef struct
{
int r[MAXSIZE + 1]; // r[0]为工作单元或闲置
int length; // length为顺序表的长度
} SqeList;
SqeList *S_null(SqeList *L){
L=(SqeList *)malloc(sizeof(SqeList));
L->length=0;
return L;
}
SqeList *S_c(SqeList *L){
L=S_null(L);
int n;
printf("'0'退出");
scanf("%d",&n);
while(n!=0){
if(L->length==MAXSIZE){
printf("已满");
break;
}
L->length++;
L->r[L->length]=n;
scanf("%d",&n);
}
return L;
}
void read(SqeList *L){
int i=0;
for ( i = 1; i <= L->length; i++)
printf("%d ",L->r[i]);
printf("\n");
}
int S_P(SqeList *L){
int i=1;
for(;i<L->length;i++){
if(L->r[i]>L->r[i+1])
break;
}
if(i==L->length)
return 1;
else return 0;
}
void J_O(SqeList *L,int s){
int i,temp;
if(S_P(L))
return;
for(i=s;i<L->length;i+=2){
if(L->r[i]>L->r[i+1]){
temp=L->r[i];
L->r[i]=L->r[i+1];
L->r[i+1]=temp;
}
}
if(s%2==0) J_O(L,1);
else J_O(L,2);
}
int main(void){
SqeList *L;
L=S_c(L);
read(L);
J_O(L,1);
read(L);
return 0;
}