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