奇偶排序
2013-09-30 21:30 youxin 阅读(790) 评论(0) 编辑 收藏 举报这个算法一般见得比较少,其核心思想非常简单,在数组中重复两趟扫描。第一趟扫描选择所有的数据项对,a[j]和a[j+1],j是奇数(j=1, 3, 5……)。如果它们的关键字的值次序颠倒,就交换它们。第二趟扫描对所有的偶数数据项进行同样的操作(j=2, 4,6……)。重复进行这样两趟的排序直到数组全部有序。
和冒泡排序法一样,奇偶排序的时间复杂度为O(N^2)。以一个实例来说明下:
待排数组[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]
c++代码:
#include<iostream> using namespace std; void oddEvenSort(int a[],int n) { bool sorted=false; while(!sorted) { sorted=true; for(int i=0;i<n-1;i+=2) { if(a[i]>a[i+1]) { swap(a[i],a[i+1]); sorted=false; } } for(int i=1;i<n-1;i+=2) { if(a[i]>a[i+1]) { swap(a[i],a[i+1]); sorted=false; } } } } int main() { int a[]={6,2,4,1,5,9}; oddEvenSort(a,sizeof(a)/sizeof(int)); for(int i=0;i<sizeof(a)/sizeof(int);i++) { cout<<a[i]<<ends; } cout<<endl; }
代码中有一点要注意点:
for(int i=0;i<n-1;i+=2)
这里我们要把i限制最大为n-2,因为后面还有访问a[i+1],这里有特别注意。
该算法在单核时代没流行起来主要是因为时间复杂度不怎么样,而且代码还比较多。但在多核处理器中采用还是蛮有用的。
参考:http://zh.wikipedia.org/zh-cn/奇偶排序