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;
          }
  
            }
            }
            }

 

posted @ 2016-04-20 20:44  庞某人  阅读(398)  评论(0编辑  收藏  举报