C语言 奇偶排序算法详解及实例代码
作者:lqh 发布时间:2023-04-17 04:47:39
C语言奇偶排序算法
奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算。这是与冒泡排序特点类似的一种比较排序。该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换。下一步重复该操作,但针对所有的(偶-奇)位置数字对。如此交替进行下去。
使用奇偶排序法对一列随机数字进行排序的过程
处理器数组的排序
在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连。所有处理器可同时与邻居进行比较、交换操作,交替以奇-偶、偶-奇的顺序。该算法由Habermann在1972年最初发表并展现了在并行处理上的效率。
该算法可以有效地延伸到每个处理器拥有多个值的情况。在Baudet–Stevenson奇偶合并分区算法中,每个处理器在每一步对自己所拥有的子数组进行排序,然后与邻居执行合并分区或换位合并。
Batcher奇偶归并排序
Batcher奇偶归并排序是一种相关但更有效率的排序算法,采用比较-交换和完美-洗牌操作。
Batcher的方法在拥有广泛互连的并行计算处理器上效率不错。
算法
举例:待排数组[6 2 4 1 5 9]
第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比,4和1比,5和9比
[6 2 4 1 5 9]
交换后变成
[2 6 1 4 5 9]
第二次比较偶数列,即6和1比,5和5比
[2 6 1 4 5 9]
交换后变成
[2 1 6 4 5 9]
第三趟又是奇数列,选择的是2,6,5分别与它们的邻居列比较
[2 1 6 4 5 9]
交换后
[1 2 4 6 5 9]
第四趟偶数列
[1 2 4 6 5 9]
一次交换
[1 2 4 5 6 9]
以下表现其单处理器算法,类似冒泡排序,较为简单但效率并不特别高。
// Completed on 2014.10.8 12:05
// Language: C99
//
// 版权所有(C)codingwu (mail: oskernel@126.com)
// 博客地址:http://www.cnblogs.com/archimedes/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
void swap(int *a, int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
void printArray(int a[], int count)
{
int i;
for(i = 0; i < count; i++)
printf("%d ",a[i]);
printf("\n");
}
void Odd_even_sort(int a[], int size)
{
bool sorted = false;
while(!sorted)
{
sorted = true;
for(int i = 1; i < size - 1; i += 2)
{
if(a[i] > a[i + 1])
{
swap(&a[i], &a[i + 1]);
sorted = false;
}
}
for(int i = 0; i < size - 1; i += 2)
{
if(a[i] > a[i + 1])
{
swap(&a[i], &a[i+1]);
sorted = false;
}
}
}
}
int main(void)
{
int a[] = {3, 5, 1, 6, 9, 7, 8, 0, 11};
int n = sizeof(a) / sizeof(*a);
Odd_even_sort(a, n);
printArray(a, n);
return 0;
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
猜你喜欢
- 本文实例讲述了Java实现二分查找算法。分享给大家供大家参考。具体如下:1. 前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的
- 本文实例为大家分享了java实现简单发红包的具体代码,供大家参考,具体内容如下这个案例是普通红包,均分的,不是拼手气红包。package n
- 我们通常在使用Java 调用脚本的时候,会使用 Runtime 类如:// 打开浏览器并访问 http://localh
- 环境变量这个概念不陌生, 就是操作系统的环境变量。系统变量就是java本身维护的变量。 通过 System.getProperty 的方式获
- 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理
- 本文实例讲述了android编程之xml文件读取和写入方法。分享给大家供大家参考。具体分析如下:一、环境:主机:WIN8开发环境:Eclip
- 本文实例讲述了C#关闭指定名字进程的方法。分享给大家供大家参考。具体实现方法如下:public static void stopNamedP
- 一、垃圾回收机制创建对象就会占据内存,如果程序在执行过程中不能再使用某个对象,这个对象是徒耗内存的垃圾。作为程序员不用关心回收垃圾对象问题,
- 效果图如下所述:布局<?xml version="1.0" encoding="utf-8"?
- 引言上文Android:实现一个自定义有限制区域的图例(角度自识别)涂鸦工具类(中)中我们已经实现了在复杂的异形区域中涂鸦,最后生成图片保存
- java.sql.Timestamp(时间戳)继承父类:java.util.Date所有已实现的接口:Serializable, Clone
- 在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有
- Java序列化JSON时long型数值,会出现精度丢失的问题。原因:java中得long能表示的范围比js中number大,也就意味着部分数
- 本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下前端通过form表单的enctype属性,将数据传递方式修改
- 要求:取指定目录下面的所有图片,以表格的型式展示并显示该图片的相对路径。服务端代码: public partial class ViewIc
- 先创建一个CacheHelper.cs类,代码如下:using System;using System.Web;using System.C
- 昨天弄了一天的Android Studio svn,感觉没有eclipse的svn好装,中间遇到很多的麻烦问题。这里来记录下吧下载下来的时候
- 项目中为了实现账号多设备登录的监听 一个账号在别的设备登录时在该设备上需要弹出对话框提示 故而用到全局对话框方案一、1、在开发中有时会用到全
- 前言翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来。当然现在看来,里面有很多的不足之处,但因博主现在已
- 前言早期在学习泛型的协变与逆变时,网上的文章讲解、例子算是能看懂,但关于逆变的具体应用场景这方面的知识,我并没有深刻的认识。本文将在具体的场