从今天开始每天尽量都写个算法,有的题容易,有的题不容易,也欢迎大家把自己的实现放到上面。
using System;
using System.Collections.Generic;
using System.Text;
namespace __4_CS
{
class Program
{
static void Main(string[] args)
{
int[] intTest = { 0, 1, 2, 0, 0, 3, 12, 33, 3, 5, 0, 14 }; //
PrintArray(intTest);
//zero(ref intTest); //方法1
Zero_N(ref intTest); //方法2
PrintArray(intTest);
Console.ReadLine();
}
//对数组进行排序
//实现思路:从前边往后检查每一个元素,如果发现某元素为零,就将它后面的所有的元素顺序前移动一位。
//可惜算法复杂度为(N2)
static void zero(ref int[] intArray)
{
int iZeroNum = 0;
for (int i = 0; i <= intArray.Length - 1 - iZeroNum; i++)
{
if(intArray[i] != 0)
{//如果当前元素不是0
continue;
}
else
{//如果当前元素是0,把所有的元素向前移动,把0放到最后
for(int j=i+1;j<=intArray.Length-1;j++)
{
intArray[j-1] = intArray[j];
}
intArray[intArray.Length - 1] = 0;
i--;
iZeroNum++;
}
}
}
//对数组进行排序
//实现思路 : 找到第一个零元素v[i],从i+1开始,往后检查每个元素v[j],若v[j]不是零,就将v[j]存入v[i]中,再将
//v[j]设置为0,并令i+1,在检查了v[n]后,结束算法。
static void Zero_N(ref int[] intArray)
{
int iArrayLen = intArray.Length;
int i = 0;
while(i<iArrayLen-1)
{
if(intArray[i] != 0)
{//如果i元素不为0,向下找
i++;
continue;
}
else
{//如果i元素为0,开始找不为0的J
int j=i+1;
bool bExchange = false; //表示是否有交换
while(j<iArrayLen)
{
if(intArray[j] == 0)
{//如果当前J为0,向下找
j++;
}
else
{//如果当前j不为0,交换array[i] array[j]
intArray[i] = intArray[j];
intArray[j] = 0;
bExchange = true; //表明发生了交换
break;
}
}
if (bExchange == false)
{//如果没有发生i,j的交换,说明i和i以后全都是0.应该结束
break;
}
}
}
}
//打印函数
static void PrintArray(int[] intArray)
{
for (int i = 0; i <= intArray.Length - 1; i++)
{
Console.Write(intArray[i]);
if (i != intArray.Length - 1)
{
Console.Write(",");
}
}
Console.WriteLine("");
}
}
}