奇偶排序Odd-even sort

来源:互联网 发布:php生成二维码 编辑:程序博客网 时间:2024/06/05 04:29

奇偶排序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;        }    }}



0 0
原创粉丝点击