奇偶排序Odd-even sort

39 篇文章 1 订阅
37 篇文章 11 订阅

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值