您的位置:首页 > 其它

奇偶排序Odd-even sort

2016-01-21 11:52 549 查看
奇偶排序Odd-even sort

参看 维基百科的定义



又一个比较性质的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序



举例,待排数组[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]

using System;
using System.Collections.Generic;

namespace Com.Colobu.Algorithm.Exchange
{
    /// <summary>
    /// <b>奇偶排序</b>的思路是在数组中重复两趟扫描。
    /// 第一趟扫描选择所有的数据项对,a[j]和a[j+1],j是奇数(j=1, 3, 5……)。
    /// 如果它们的关键字的值次序颠倒,就交换它们。
    /// 第二趟扫描对所有的偶数数据项进行同样的操作(j=2, 4,6……)。
    /// 重复进行这样两趟的排序直到数组全部有序。
    /// 
    /// 平均时间复杂度:O(n^2)
    /// Stability:Yes
    /// </summary>
    public class OddEvenSortAlgorithm
    {
        public static void OddEvenSort<T>(IList<T> szArray) where T : IComparable
        {
            bool sorted = false;
            while (!sorted)
            {
                sorted = true;
                // odd-even
                for (int i = 1; i < szArray.Count - 1; i += 2)
                {
                    if (szArray[i].CompareTo(szArray[i + 1]) > 0)
                    {
                        Swap(szArray, i, i + 1);
                        sorted = false;
                    }
                }
                // even-odd
                for (int j = 0; j < szArray.Count - 1; j += 2)
                {
                    if (szArray[j].CompareTo(szArray[j + 1]) > 0)
                    {
                        Swap(szArray, j, j + 1);
                        sorted = false;
                    }
                }
            }
        }
        private static void Swap<T>(IList<T> szArray, int i, int j)
        {
            T tmp = szArray[i];
            szArray[i] = szArray[j];
            szArray[j] = tmp;
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: