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;

运行结果

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

参考技术A

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

本回答被提问者采纳
参考技术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语言分段排序 整型数组,偶数在前,奇数在后,从小到大的主要内容,如果未能解决你的问题,请参考以下文章

请问在java数组中怎么判断奇数偶数的个数?

奇数偶数排序技巧分析

c语言中 排列偶数与奇数,奇数在后,偶数在前

算法 调整数组顺序,使得奇数在前偶数在后,分别保证奇数和偶数之间的相对位置不变

输入 10 个整数,将这 10 个数按升序排列,并且奇数在前偶数在后?

空瓶换水喝水问题?给一个数组,如何让奇数在前偶数在后?C语言从入门到入土(进阶篇)(算法篇p5)