zoukankan      html  css  js  c++  java
  • 奇偶排序

    这个算法一般见得比较少,其核心思想非常简单,在数组中重复两趟扫描。第一趟扫描选择所有的数据项对,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/奇偶排序
  • 相关阅读:
    SQL 从查询结果里查询
    c++函数返回局部变量
    《Android源代码设计模式解析与实战》读书笔记(二十)
    也谈学习
    Ejb in action(一)——开篇介绍
    Re-ID with Triplet Loss
    AFNetworking、ASIHTTPRequest中SSL的使用
    BZOJ 1982: [Spoj 2021]Moving Pebbles [博弈论 对称]
    BZOJ 3895: 取石子[SG函数 搜索]
    BZOJ 2463: [中山市选2009]谁能赢呢?[智慧]
  • 原文地址:https://www.cnblogs.com/youxin/p/3347898.html
Copyright © 2011-2022 走看看