//插入排序的优化版,选取一个中间数然后依次将后面的数插入到中间数的两端
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]+" ");
}
}
}