20100127_1 设一维数组V中存有N个整数,试写一个算法,将其中的非零元素移到数组的前面来,连续存放,相对位置不变。

从今天开始每天尽量都写个算法,有的题容易,有的题不容易,也欢迎大家把自己的实现放到上面。

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("");
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值