(一)算法——冒泡排序、选择排序

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

简介

     算法是解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。——摘自百度百科

       为什么要用算法呢?假设现在给出三个数A,B,C,请你找出这三个数中最大的一个数。答案不止一种,不过我猜,有一部分人要选择if...else方法,一步一步的逐个比较,找出最大的数之后将最大值放到一个变量中,然后将该最大值输出出来!答案,没有绝对的对与错,而有适合不适合!现在只是给出了三个数,当我们给出100个数,1000个数的时候呢?如果简单的使用if...else去解决问题是不是超级累呀?对选择排序有一定了解的程序猿,可能会想出一个较为简单的方法,假设最大值! 拿3个数为例 ,代码如下,这样做就将比较局部化,只需考虑相邻的两个数,不用再去管有多少个数,max只要一直走下去就能保证自己是最大的!

 

<span style="font-size:18px;"><span style="font-size:18px;">int a,b,c,max;  //定义变量
max = a;        //假设最大值为a
  if(b>max){    //当b>max时将b赋值给max
     max = b;
  }else if(c>max){   //当c>max时将c赋值给max
     max = c; 
  }
   print max;  //打印最大值</span></span>

选择排序(从小到大排序)

 

1.原理

     ①从第2位开始寻找最小数与第一位交换
     ②从第3位开始寻找最小数与第2位交换
     ③直到第n个元素和第n-1个元素相比为止

2.示例

      我们随机生成10个1-100之间的整数,见结果展示中的第0次排序后即为自动生成的10个整数。

3.代码实现

 

//引用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;   //计算耗时类
 static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start(); //开始计时
            int temp;       //中间变量
            int index = 0;  //最小数的脚标
            Random example = new Random();  //随机数
            int[] num = new int[10];        //包含10个元素的数组
            string unSort = "第0次排序后:";  //未排序前序列
            string Sort = "";   //排序后的序列
            
           //生成随机数
            for (int numCount = 0; numCount < 10; numCount++)
            {
                 int number = example.Next(1, 100);
                 num[numCount] = number;
                 unSort = unSort +"  "+ num[numCount];                
            }
            unSort = unSort + "\r\n\r\n\r\n";    //换行
            Console.Write(unSort);    //输出未排序前的序列

            //从小到大排序
            for (int i = 0; i < num.Count()-1; i++)
            {
                index = i;
                for (int j = i+1; j < num.Count(); j++)
                {
                    //寻找从第j位开始最小数
                    if (num[j]<num[index])
                    {
                        index = j;
                    }
                }
                //第i个数和最小的数交换
                temp = num[i];
                num[i] = num[index];
                num[index] = temp;

                //排一次序输出一次排序结果
                Sort = "";
                Sort = "第" + (i + 1) + "次排序后:";                
                for (int k = 0; k < num.Count(); k++)
                {
                    Sort =Sort+ "  " + num[k];                   
                }
                Sort = Sort + "\r\n\r\n\r\n";
                Console.Write(Sort);

            }
            sw.Stop();  //计时结束
            TimeSpan ts2 = sw.Elapsed;  //计算该算法耗时
            Console.Write("总共花费{0}ms.", ts2.TotalMilliseconds); //输出该算法耗时
            Console.ReadKey();
        }

 

4.用时

                           

5.结果展示

     说明:绿色框起来的数是待交换的数,红色标出来的是两个数进行交换,交换后会得到下一行的排序结果。看着排序的结果特别像一个倒三角。

                         

6.稳定性

     因为第i个值具体和哪个数进行交换是不确定的,假如有两个相同的数值,就拿20来举个例子。现在序列中有两个相同的值20,假如经过一系列的交换后,前边的20跑到了后边20的后边。这个时候两个相同的值实际上可以看作是交换了位置。所以这种算法是不稳定的。

冒泡排序(从小到大排序)

 

1.原理

      ①从第一对开始相邻的两个数两两进行比较,若第一个数比第二个数大,则两个数进行交换,依次对所有元素进行相邻两数两两比较,此时得到最后一个数是该序列中最大的数。

      ②排完第一轮之后,最后一个数则是有序区,除第一个数之外前边所有数是无序区(参考结果展示图,绿色标志的为无序区,剩下的为有序区)。再对无序区进行第一步的操作,依次会得到相应的有序区和无序区。

      ③依次对无序区进行第①步的操作直至所有序列为有序区

2.示例

      我们随机生成10个1-100之间的整数,采用冒泡排序方法进行排序。

3.代码实现

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;   //计算耗时类

namespace 冒泡排序算法
{
    class Program
    {
        static void Main(string[] args)
        {           
            Stopwatch sw = new Stopwatch(); //计算耗时类
            sw.Start();
            int temp;
            Random example = new Random();
            int[] num = new int[10];    //包含10个元素的数组
            //生成随机数
            for (int rnd = 0; rnd < num.Length-1; rnd++)
            {
                num[rnd] = example.Next(1, 100);    //随机生成10个数放入数组中
            }
            //打印输出排序前的数组
            Console.Write("排序前数组:");
            foreach (int item in num)
            {
                Console.Write(item + "  ");
            }
            Console.WriteLine("\r\n\r\n");

            //排序
            for (int outside = 0; outside < num.Length-1; outside++)
            {
                for (int inside = 0; inside < num.Length-1-outside; inside++)
                {
                    if (num[inside]>num[inside+1])
                    {
                        temp = num[inside];
                        num[inside] = num[inside + 1];
                        num[inside + 1] = temp;
                    }
                }
                Console.Write("第" + (outside + 1)+"次排序后:");
                foreach (int item in num)
                {
                    Console.Write(item + "  ");
                }
                Console.WriteLine("\r\n\r\n");
            }
            sw.Stop();
            TimeSpan ts2 = sw.Elapsed;
            Console.Write("总共花费{0}ms.", ts2.TotalMilliseconds); //输出该算法耗时
            Console.ReadKey();
        }
    }
}

 

4.用时

                       

5.结果展示

                    

6.稳定性

      该算法的原理是相邻的两个数进行比较,假设相邻的两个数是相等的,那他就不会进行交换。所以这个算法是稳定的。

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值