二路归并排序



//插入排序的优化版,选取一个中间数然后依次将后面的数插入到中间数的两端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lianglu
{
    class Program
    {
        //二路归并排序
        static void Main(string[] args)
        {
            int[] b={23,67,4,3,4,5,6,7,2,56,77,29};
            int[] a=new int[100];               //a作为循环序列存放排序后的数长度应选取的比b长或相等
            int first=0, last=0,k,temp=0;    //first,last分别作为最大数和最小数的位置记号
            a[0] = b[0];           //将a[0]=b[0]作为中间数,b中以后的元素如果大于此中间数则放置在a[0]的右边,若小于则放在a[0]的右边
            for (int i = 1; i < b.Length; i++) {
                if (b[i] > a[0])
                {
                    //如果b[i]大于a[0],则将b[i]置于a[0]的右边
                    k = last;      //k中保存新加入的数需要插入的位置
                    if (k == 0)
                    {
                        a[++k] = b[i];
                    }
                    else
                    {
                        while (a[k] > b[i]) k--;
                        if (k != last)
                        {
                            //如果新加入的数比a中最大的数小
                            temp = last;             //temp用来作移动元素的索引,移动到k位置为止
                            while (temp != k)
                            {
                                a[temp + 1] = a[temp];
                                temp--;
                            }
                            a[temp + 1] = b[i];
                        }
                        else {
                            //如果新加入的数比右边最大的数大
                        a[k+1]=b[i];
                        }
                      
                    }
                    last++;
                }

                else
                {
                    //如果b[i]小于a[0],则将b[i]置于a[0]的左边
                    k = first;
                    if (k == 0)
                    {
                        k--;
                        k += 100;
                        a[k] = b[i];
                    }
                    else
                    {
                        Console.Write("first="+first);
                        try
                        {
                            while (a[k] < b[i]) k = (k + 1) % 100;
                            Console.Write("k="+k+"    ");
                            temp = first % 100;
                            while (temp != k)
                            {
                                a[temp - 1] = a[temp];
                                temp = (temp + 1) % 100;
                                Console.Write("temp ="+temp+"    ");
                            }
                            temp--;
                            if (temp < 0) temp += 100;        //此时当temp为左边第一个数temp=0时--操作使得他越界
                            Console.Write(temp);
                            a[temp] = b[i];
                        }
                        catch (Exception ex) {
                            Console.Write(ex.Message);
                        }
                      
                    }
                    first--;
                   first= first < 0 ? first += 100 : first;
                   
                }
            }
          
            Console.Write("first="+first+",last="+last);
            for (int j = first; j != last+1; j = (++j) % 100)
                Console.Write(", "+a[j]+"  ");

        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值