C语言实现数组的奇偶排序

今天遇到了个实现数组的奇偶排序的问题,与大家分享下解决思路。

思路1:创建新的数组对所求数组进行遍历,技术放在一起偶数放在一起,再用穿件数组中的内容替换到所求数组中,代码如下:

#define LEN 10
#include<stdio.h>
#include<stdlib.h>
int main()
{
int arr[LEN] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };//数组的初始化
int odd[LEN] = { 0 };//用来存储奇数
int dou[LEN] = { 0 };//用来存储偶数
int j = 0;
int k = 0;
for (int i = 0; i < LEN; i++)
{
if (arr[i] % 2)
{
odd[j] = arr[i];
j++;
}
else
{
dou[k] = arr[i];
k++;
}
}
for (int i = 0; i < LEN; i++)//对目标数组的更改
{
if (i <= j)
{
arr[i] = odd[i];
}
else
{
arr[i] = dou[i - j - 1];
}
}
for (int i = 0; i < LEN; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return 0;
}

思路2:如果不允许创建新的空间变量怎么办呢,我们可以用冒泡排序的思想来解决这个问题,如果这个数是奇数,我们就把它冒泡的数组顶端,依次冒泡下去,我们就能得到答案,实现代码如下:

#include<stdio.h>
int* doubleline(int *a, int size)//冒泡排序实现奇偶排序所封装的函数
{
int i = 0;
for (i = 0; i < size; i++)//冒泡过程
{
for (int j = 0; j < size - i - 1; j++)
{
if ((*(a + j) % 2)==0)
{
int tmp = *(a + j);
*(a + j) = *(a + j + 1);
*(a + j + 1) = tmp;
}
}
}
return a;
}
int main()//调试过程
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int size = sizeof(arr) / sizeof(int);//求取数组大小
int *p = doubleline(arr, size);
for (int i = 0; i < size; i++)
{
printf("%d ",*(p+i));
}
system("pause");
return 0;
}

个人认为冒泡排序虽然节省了空间,但是如果数组特别大的时候这样做的效率是极其低下的,希望运用的时候斟酌下。

如有什么不足之处,希望批评指正。

时间: 2024-07-29 06:06:40

C语言实现数组的奇偶排序的相关文章

对数字数组进行奇偶排序的两种不开辟多余空间方法

//#include<stdio.h> //#include<stdlib.h> //void  jo(int arr[], int len) //{ // int value; // int i,j; // for (i = 0; i < len; i++) // { // if (arr[i] % 2 == 0) // { // value = arr[i]; // for (j = i; j < len; j++) // { // if (arr[j] % 2 !

力扣(LeetCode)922. 按奇偶排序数组 II

给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数. 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数:当 A[i] 为偶数时, i 也是偶数. 你可以返回任何满足上述条件的数组作为答案. 示例: 输入:[4,2,5,7] 输出:[4,5,2,7] 解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受. 提示: 2 <= A.length <= 20000 A.length % 2 == 0 0 <= A[i] <= 1000 思路 遍

按奇偶排序数组

export default (arr) => { // 进行升序排序 arr.sort((a, b) => a - b) // 声明一个空数组用来存储奇偶排序后的数组 let r = [] // 记录奇数.偶数位下标 let odd = 1 let even = 0 // 对数组进行遍历 arr.forEach(item => { if (item % 2 === 1) { r[odd] = item odd += 2 } else { r[even] = item even += 2

使用函数指针,完成一个sort()函数,能对任何类型的数组元素进行排序: 回调函数 以及 memcpy ()原型实现

进来复习了一下C语言指针,一直没有写过太多关于函数指针的代码,而且对回调函数的理解一直都是在理论上,基本上没有太写过关于它的代码,进来得空,写了一个小程序加深下自己对回调函数和函数指针的理解. 问题描述: 编写一个sort()函数,使它能够对任何类型的数组元素进行排序. 下面是我写的代码: /* 使用函数指针的回调函数技巧,设计一个能排序int 和char 数组的sort()函数 */ #include<stdio.h> #include<stdlib.h> #include<

华为机试—元素按奇偶排序

题目:元素按奇偶排序 给定一个数组input[],如果数组长度n为奇数,则将数组中最大的元素放到 output[]数组最中间的位置, 如果数组长度n为偶数,则将数组中最大的元素放到 output[]数组中间两个位置偏右的那个位置上, 然后再按从大到小的顺序,依次在最大元素放置的那个位置的两边,按照一左一右的顺序,依次存放剩下的数. 例如:input[] = {3, 6, 1, 9, 7}   output[] ={3, 7, 9, 6, 1};      input[] = {3, 6, 1,

PHP 字符串数组按照拼音排序的问题

拼音排序的规则: 字符串包括特殊字符.数字.英文字符.中文字符等等,排序结果要求,特殊字符排在第一梯队,将其按照首个字符ascii码表进行排序,数字字符排在第二梯队,将首个字符数字按照数字大小排序,英文字符排在第三梯队,按照首字母字母表顺序排序,中文字符排在第三梯队,将按照拼音的首字母排序 .(此处不考虑其他语言的字符). 数据库查询排序: 查询数据库的时候可以将某个字段按照中文排序.如下,将查询结果以name字段排序 SELECT name FROM crm.b_user where name

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个“奇偶排序”说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想. 下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有

奇偶排序算法

奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序.该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 使用奇偶排序法对一列随机数字进行排序的过程 本文地址:http://www.cnblogs.com/archimedes/p/odd-even-sort-algorithm.html,转载

奇偶排序

在<java高并发程序设计>一书中看到关于一种并行算法排序方法:奇偶排序.结合书上与网上的各项资料,在这里按自己的理解做下梳理. 介绍 冒泡排序:是串行算法,在每次迭代过程中,对于每个元素可能与前面元素交换,也可能和后面的元素交换,数据的相关性比较强很难直接改成并行算法. 奇偶排序:或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序. 该算法中,排序过程分两个阶段,奇交换和偶交换,两种交换都是成对出现.对于奇交换,它总是比