zoukankan      html  css  js  c++  java
  • 20160420冒泡排序和查找

    2016-04-20

    11

    1:冒泡排序原理

    1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

    2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

    3)针对所有的元素重复以上的步骤,除了最后一个。

    4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。


    目的:按从小到大排序。 

    方法: 
    假设存在数组:9, 10, 5, 8, 7, 4, 3, 1, 6, 2
    第一轮比较相邻两个元素,如果左边元素大于右边元素,则交换。 
    9和10比较的结果就是,9在前,10在后; 
    然后10和5比较的结果,5在前,10在后; 
    以此类推,第一轮比较之后的结果是:9,5,8,7,4,3,1,6,2,10 
    经过第一轮比较,最大的元素跑到了最后一个,所以第二轮比较,最后一个元素不需要进行比较了。  
    第二轮还是从索引0和1开始比较,只是不需要比较最后一个了,算法还是一样的。第三轮、第四轮以此类推。 
    排序之后的结果:1,2,3,4,5,6,7,8,9,10

    代码如下:

    static void Main(string[] args)
            {
    
    int[] a = new int[10] { 9, 10, 5, 8, 7, 4, 3, 1, 6, 2 };
                for (int i = 0; i < a.Length ; i++)
                {
                    for (int j = i; j < a.Length -1; j++)
                    {
                        if (a[i] > a[j + 1])//从大到小排列,大于换成小于
                        {
                            int t = a[i];
                            a[i] = a[j + 1];
                            a[j + 1] = t;
    
                        }
                    }
                  }
                for (int k = 0; k < 10;k++ )
                {
                    Console.WriteLine(a[k]);
                }
    }

    运行显示:

    ★ 其他总结

    练习:使用冒泡排序,做歌赛的打分程序。要求去掉两个最高,两个最低分,求平均得分。

    代码:

    static void Main(string[] args)
            {
    int[] a = new int[20];
                
                for (int i = 0; i <a.Length ;i++ )
                {
                    Console.WriteLine("请输入评分:");
                    a[i] = Convert.ToInt32(Console.ReadLine());
                }
    
                for (int i = 0; i < a.Length; i++)
                {
                    for (int j = i; j < a.Length - 1; j++)
                    {
                        if (a[i] > a[j + 1])
                        {
                            int t = a[i];
                            a[i] = a[j + 1];
                            a[j + 1] = t;
                        }
    
                    }
                }
              
                int sum = 0;
                for (int i=0;i<a.Length ;i++)
                {
                    sum = sum + a[i];
                }
                int avg = (sum - a[0] - a[1] - a[18] - a[19]) / 16;
                Console.WriteLine("平均分是:{0}",avg);
    }

    2.查找

    顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查询不成功

    流程:输入要查找的数,查找,判断输出

    示例

    static void Main(string[] args)
            {
                int[] a = new int[10] { 7, 9, 14, 19, 24, 28, 36, 38, 56, 89 };
                Console.WriteLine("输入一个数:");
                int t = Convert.ToInt32(Console.ReadLine());
                bool cunzai = false ;
                for (int i = 0;i<10 ; i++)
                {
                    if (t == a[i])
                    {
                        cunzai = true;
                        Console.WriteLine("找到啦");
                        break;
                    }
    
                }
                if (cunzai == false)
                {
                    Console.WriteLine("不存在");
                }
            
            }

     ☆ 二分法查找

       折半查找,也叫二分查找,当在一个数组或集合中查找某个元素时,先定位出中间位置元素,如果要查找的元素正好和该中间位置元素相等,通过一次查找,就能找到匹配元素;如果要查找的元素小于该中间位置元素,就抛弃后面一半的元素,在前面一半的元素中再定位出中间位置元素,如此反复,直到找到匹配元素;如果要查找的元素大于该中间位置元素,就抛弃前面一半的元素,在后面一半的元素中定位出中间位置元素,如此反复。

    面临的第一个问题是:中间位置元素如何定位?在折半查找中规定:当元素个数是奇数,比如有3个元素,中间位置元素是索引为1的元素;当元素个数是偶数,比如有4个元素,索引为1和2的元素理论都是中间位置元素,但在折半查找中,把后面这个,即索引为2的元素视为中间位置元素。

    面临的第二个问题是:由于,要查找的元素和中间位置元素之间需要比较,我们在比较之前,势必要让数组按升序或降序来排列。

    自定义一个类,该类维护着一个int[]类型数组,通过构造函数确定数组长度和对数组进行排序,并提供打印数组元素的方法,以及折半算法。

    示例:

    static void Main(string[] aregs)
    
            {
                int[] a = new int[10] { 2,12,13,26,35,39,68,69,84,92};
                Console.WriteLine("输入要查找的数:");
                int b = Convert.ToInt32(Console .ReadLine ());
                int start = 0, end = a.Length - 1, mid;
                for (int i = 0; i < a.Length;i++ )
                { 
                    mid=(start +end )/2;
                if (b==a[mid])
                {
                    Console.WriteLine("找到啦!");
                    break;
                }
                else 
                {
                if (b>a[mid])
                {
                    start = mid + 1;
                }
                else 
                {
                    start = mid - 1;
                }
              if (end<start )
                {
                    Console.WriteLine("没找到");
                    break;
              }
      
                }
                }
                }
  • 相关阅读:
    进程与线程的区别与联系
    c 指针兼容性问题
    柔性数组
    Makefile之wildcard
    shell编程笔记1
    linux下gcc编译的参数详细说明
    的理解
    URL与URI的区别
    Log4J积累
    linux 查看磁盘、文件夹、文件大小(df du)
  • 原文地址:https://www.cnblogs.com/pangchunlei/p/5414252.html
Copyright © 2011-2022 走看看