c语言分段排序 整型数组,偶数在前,奇数在后,从小到大
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
运行结果
注:运行结果略去输入数组部分
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;
本回答被提问者采纳 参考技术B
#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;
奇数在前偶数在后。各自反转后相连
#include <iostream> #include <stdlib.h> using namespace std; struct node { struct node *next; int value; }; node *CreateListNode(int value) { if(value==NULL) return NULL; node *pNode=(node*)malloc(sizeof(node)); pNode->value=value; pNode->next=NULL; return pNode; } void ConnectNodes(node*pCurrent,node* pNext) { if (pCurrent==NULL) { cout<<"Error to connect two nodes."<<endl; exit(1); } pCurrent->next=pNext; } void PrintList(node* pHead) { node *pNode=pHead; while (pNode!=NULL) { cout<<pNode->value<<" "; pNode=pNode->next; } cout<<endl; } struct node *reverse(struct node *list) { if (list==NULL) return NULL; if(list->next==NULL) return list; node* tPre=list; node* tmp=list->next; while (tmp) { node* tNext=tmp->next; tmp->next=tPre; tPre=tmp; tmp=tNext; } list->next=NULL; list=tPre; return list; } struct node *swap(struct node *list) { if (list==NULL) return NULL; if (list->next==NULL) return list; node *p=list; node *OddHead=(node*)malloc(sizeof(node)); node *EvenHead=(node*)malloc(sizeof(node)); node *Odd=OddHead; node *Even=EvenHead; while (p) { if (p->value%2==0) { Even->next=p; Even=p; } else { Odd->next=p; Odd=p; } p=p->next; } Even->next=NULL; Odd->next=NULL; Even=reverse(EvenHead->next); Odd=reverse(OddHead->next); OddHead=Odd; while (Odd->next) Odd=Odd->next; Odd->next=Even; return OddHead; //return OddHead; } int main() { node *pNode1=CreateListNode(4); node *pNode2=CreateListNode(5); node *pNode3=CreateListNode(7); node *pNode4=CreateListNode(1); node *pNode5=CreateListNode(6); ConnectNodes(pNode1,pNode2); ConnectNodes(pNode2,pNode3); ConnectNodes(pNode3,pNode4); ConnectNodes(pNode4,pNode5); node* p=swap(pNode1); PrintList(p); return 0; }
以上是关于c语言分段排序 整型数组,偶数在前,奇数在后,从小到大的主要内容,如果未能解决你的问题,请参考以下文章
算法 调整数组顺序,使得奇数在前偶数在后,分别保证奇数和偶数之间的相对位置不变