//选择排序,从小到大
public static int SelectSort(int[] a)
{
int count=0;// 计算时间复杂度,运行的次数
int length = a.Length;
int k= 0;
int chan;//用来交换的中间变量

for(int i=0;i<length;i++) //需要更换的位置i
{
k =i; //初始化最大值的下标
for(int j=i;j<length;j++) //寻找最大值
{
if(a[j]<a[k])
{
k=j;
}

count++;

}

 


//将最大值和需要换的位置i上的值互换
chan = a[i];
a[i] = a[k];
a[k] = chan;
}

for(int i=0;i<length;i++)
{
Console.Write(a[i].ToString()+"/t");
}
return count;
}

//冒泡排序从小到大
public static int ToTop(int[] array)
{
int count=0;
int p=1;//标志量,看数组是否已经符合了了从小到大的排序要求
int chan; //用来交换的临时变量
int length = array.Length;
for(int i=0;i<length-1&&p!=0;i++) //在p=1的条件下做length-1次循环,每次循环把前面的最大值后移
{
/*
当数组满足了从小到大的排列顺序时p在下面的循环中一直被赋值为0,当做完下面的循环回到上面是因为无法符合条件跳出
*/
for(int j=0;j<length-i-1;j++) //控制比较到达的位置
{
p=0;
if(array[j]>array[j+1]) //当相连的两个数的满足前者大于后者时交换数值
{
p=1;
chan = array[j];
array[j] = array[j+1];
array[j+1] = chan;
}
count++;
}
}

for(int i=0;i<length;i++)
{
Console.Write(array[i].ToString()+"/t");
}
return count;
}

//插入排序从小到大
public static void InsertSort(int[] array)
{
int length = array.Length;
int chan;
for(int i=1;i<length;i++) //从第2个数开始做length-1次循环,分别找到下标为i的数的确切位置
{
int k=i;
while(k>0&&array[k]<array[k-1]) //当位置k上的数未超出边界值(k>0)且值小于前面的的数时需要交换
{
chan =array[k];
array[k] =array[k-1];
array[k-1]=chan;
k--; //k下标左移一位,进行下一步的比较

}
}

for(int i=0;i<length;i++)
{
Console.Write(array[i].ToString()+"/t");
}
}

/// <summary>
/// 快速排序
/// </summary>
/// <param name="array">要排序的数组</param>
/// <param name="start">正在排序的数组的起始位置</param>
/// <param name="end">正在排序的数组的结束位置</param>
public static void QuickSort(int[] array,int start,int end) //找到start位置上的数的确切位置,让数组满足他左边的数都比他小,右边的数都比他大
{
if(start == end)
return;

int Start = start;
int End =end;
if(start>end) //控制边界,起始位置下标值小于结束位置的小标值
{
Console.WriteLine("start postion larger than end postion!Error!");
return;
}
int valu = array[start]; //将start位置上的值赋给valu,位置设为空
while(start<end) //设置循环的终止条件
{
while(array[end]>valu&&end>start) //从后面往前找找到一个比valu值小的值进行调换
{
end--;
}
array[start]= array[end]; //找到的数填入前面找到start的位置 ,end位置空出
while(array[start]<valu&&start<end) //从前面往前找找到一个比valu值大的值进行调换
{
start++;
}
array[end] =array[start]; //找到的数填入前面找到end的位置 ,start位置空出

}
array[start]=valu;

QuickSort(array,Start,end); //递归,将数组的前面部分排序
QuickSort(array,end+1,End);//递归,将数组的后面面部分排序
}

public static int ShellSort(int[] array,int k)
{
int count=0;
int len = array.Length;
for(;k>0;k--)
{
for(int j=0;j<k;j++)
{
for(int h=j+k;h<len;)
{
int g = h ;
while((g-k)>=0&&array[g]<array[g-k])
{
int n = array[g-k];
array[g-k] = array[g];
array[g]=n;
g-=k;
count ++;
}
h+=k;
}
}

}

for(int i=0;i<len;i++)
{
Console.WriteLine(array[i].ToString());
}
return count;
}