c语言分段排序 整型数组,偶数在前,奇数在后,从小到大

如题所述

#include <stdio.h>
#include <conio.h>

#define LEN 100 /*数组长度上限*/
#define elemType int /*元素类型*/

/*输入数组*/
void inputArr (elemType arr[], int len) {
int i;
for (i=0; i<len; i++)
scanf ("%d",&arr[i]);
putchar ('\n');
}

/*升序冒泡排序*/
/*参数说明:*/
/*int arr[]:排序目标数组*/
/*int len:元素个数*/
void bubbleSortAsc (elemType arr[], int len) {
elemType temp;
int i, j;
for (i=0; i<len-1; i++) /*外循环控制排序趟数,len-1个数进行len-1趟*/
for (j=0;j<len-1-i; j++) { /*内循环每趟比较的次数,第j趟比较len-j次*/
if (arr[j] > arr[j+1]) { /*相邻元素比较,逆序则交换*/
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}

/*打印数组*/
void printArr (elemType arr[], int len) {
int i;
for (i=0; i<len; i++)
printf ("%d\t",arr[i]);
putchar ('\n');
}

int main (void) {
elemType arr[LEN];
elemType arrOdd[LEN], arrEven[LEN]; /*存储奇数、偶数*/ 
int len, oddLen, evenLen;
int i, j ,k;

printf ("请输入数组长度:");
scanf ("%d",&len);
printf ("请输入数组内容:\n");
inputArr (arr, len);

/*先分奇偶,后分别排序,最终合并*/
for (i=0, j=0, k=0; i<len; i++) {
if (arr[i]%2) {
arrOdd[j] = arr[i];
j++;
}
else {
arrEven[k] = arr[i];
k++;
}
}
oddLen = j;
evenLen = k;

bubbleSortAsc (arrOdd, oddLen);
bubbleSortAsc (arrEven, evenLen);

for (k=0, i=0; k<evenLen; k++, i++)
arr[i] = arrEven[k];
for (j=0; j<oddLen; j++, i++)
arr[i] = arrOdd[j];

printArr (arr,len);
putchar ('\n');

getch (); /*屏幕暂留*/
free (arr);
return 0;
}

运行结果

注:运行结果略去输入数组部分

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-13

#include <stdio.h>

void sort(int a[], int n) {
int i,j,t,k;
for(i = 0; i < n - 1;++i) {
k = i;
for(j = i + 1; j < n; ++j) {
if(a[k] > a[j]) k = j;
}
if(k != i) {
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}

int grouping(int a[], int n) {
int i = 0,j = n - 1,t,k,m = 0;
for(k = 0;k < n; ++k) if(a[k]%2 == 0) ++m; //统计偶数个数
while(i <= j) {
while(a[i]%2 == 0 && i <= m) ++i; // 从前往后找奇数,找到后,索引i停在奇数处
while(a[j]%2 == 1 && j >= n - m) --j; // 从后往前找偶数,找到后,索引j停在偶数处
if(a[i]%2 && a[j]%2 == 0) { // 确认,如果前面是奇数,且后面是偶数,则进行位置交换
t = a[i];
a[i] = a[j];
a[j] = t;
++i; // 交换后修改索引,避免数组存取越界
--j;
}
}
return m;
}

void show(int a[], int n) {
int i;
for(i = 0; i < n; ++i)
printf("%d ",a[i]);
printf("\n");
}

int main() {
int a[] = {23,21,20,35,16,18,19,75,29,28,86,23,36,94,56,88,70,37,69,55,38,12};
int m,n = sizeof(a)/sizeof(a[0]);
printf("分组前:\n");
show(a,n);
//sort(a,n);
m = grouping(a,n);//分组,并获取偶数个数
printf("偶数%d个。分组后:\n",m);
show(a,n);
sort(a,m);//前面的偶数排序
sort(a + m,n - m);//后面的奇数排序
printf("排序后:\n");
show(a,n);
return 0;
}

本回答被提问者采纳
第2个回答  2017-12-13

#include<stdio.h>

#include<malloc.h>

int main( void )

{

int i,j,k=0,t=0,temp,n;

int *p,*q,*r;

printf("请输入数组元素个数n=");

scanf("%d",&n);

p=(int *)malloc(sizeof(int)*n);

printf("请输入元素(以空格分隔)\n");

for(i=0;i<n;i++)

scanf("%d",&p[i]);

q=(int *)malloc(sizeof(int)*n);

r=(int *)malloc(sizeof(int)*n);

for(i=0;i<n;i++)

{

if(p[i]%2==0)

{

q[k]=p[i];

k++;

}

else

{

r[t]=p[i];

t++;

}

}

for(i=0;i<k-1;i++)

for(j=0;j<k-i-1;j++)

if(q[j]>q[j+1])

{

temp=q[j];

q[j]=q[j+1];

q[j+1]=temp;

}

for(i=0;i<t-1;i++)

for(j=0;j<t-i-1;j++)

if(r[j]>r[j+1])

{

temp=r[j];

r[j]=r[j+1];

r[j+1]=temp;

}

for(i=0;i<k;i++)

printf("%3d",q[i]);

for(i=0;i<t;i++)

printf("%3d",r[i]);

printf("\n");

return 0;

}

本回答被网友采纳
相似回答