C#基础解析之Ⅳ 【数组和排序】
今天和大家一起来讨论一下C#中的数组和排序。首先,先感谢一下大家的讨论和关注,这无疑是对我本人的最大支持,有了讨论我们才可以发现问题,解决问题,这样我们就可以不断的进步,不断的提升自己。在这里我还想多说两句,在之前的留言中我看到有说我写的文章比较浅,我想和大家解释一下,本人所写的文章都是一些基础中的基础,比较适合新人来研究和学习(本人也是个新手),希望老鸟和高手们给予正确的指点和帮助,因为我们都是一个台阶一个台阶爬上来的。。。
好的!我们来进入今天的正题-----数组和排序。今天的内容相对而言不是很多,但是有些东西是比较重要的比如说:冒泡排序,冒泡排序好像在面试的时候问的挺多的!呵呵!还是先来看一下一维数组吧,什么叫数组: 数组就是指具有相同名称和类型的一组变量,数组中的每个变量称为数组元素。由于有了数组,可以用相同名字引用一系列变量,并用索引号(下标)来识别它们。在许多场合中,我们使用数组可以缩短和简化程序。
还是老样子,我们用例子来说话:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 string name1 = "人族联盟";
6 string name2 = "兽人部落";
7 string name3 = "不死亡灵";
8 string name4 = "暗夜精灵";
9 Console.WriteLine("第一位玩家所用种族:{0}", name1);
10 Console.WriteLine("第二位玩家所用种族:{0}", name2);
11 Console.WriteLine("第三位玩家所用种族:{0}", name3);
12 Console.WriteLine("第四位玩家所用种族:{0}", name4);
13 Console.ReadKey();
14 }
15 }
运行结果:
大家一看就能看出上面这些代码比较麻烦而且也比较啰嗦,我们用数组写一下:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //声明有4个值得数组
6 string[] name = new string[4] { "人族联盟", "兽人部落", "不死亡灵", "暗夜精灵" };
7 for(int i=0;i<4;i++)//循环4次
8 {
9 //输出每个玩家
10 Console.WriteLine("第{0}位玩家所用种族:{1}",i+1,name[i]);
11 }
12 Console.ReadKey();
13 }
14 }
运行结果:
从例子中我们就可以明显的看出来用数组的好处,它不仅能够大大减少代码的数量,而且能够通过循环来操作更多的值,这样就可以让我们写出更漂亮的代码了。
为了更进一步了解数组我们还是看一下它的语法结构吧:
数组类型[] 数组名=new 数据类型[数组长度];
上面这个是创建数组,举个例子:int[] num =new int [5];//创建一个容纳5个整形值得数组
其中new是关键字,就是在内存里给数组分配了保存值得空间。数组里面的值(元素)都必须是同一种类型。而且数组长度是表示这个数组里最多能容纳多少值(元素)。我们也可以给数组初始化比如:int [] num =new int [5]{12,32,24,55,13,33};这里面数组有几个值,那么数组长度就是多少。如果数组长度是5,而数组中放入了第6个值,那么程序就会报错,这个也就是我们所说的数组越界。
数组的长度我们有必要简单的说一下,一般数组的长度表示为:数组名.Length,这样我们就可以得到数组的长度了。来看个例子:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //初始化一个字符串数组
6 string[] name = { "人族联盟", "兽人部落", "不死亡灵", "暗夜精灵" };
7 //循环从0开始,代表下标
8 for (int i = 0; i < name.Length; i++)//(^o^)注意啦!Length在这里!
9 {
10 //判断这个数组的一个元素的值是否是兽人部落
11 if (name[i] == "兽人部落")
12 {
13 Console.WriteLine("第{0}个是{1}。",i+1,name[i]);
14 break;
15 }
16 }
17 Console.ReadKey();
18 }
19 }
运行结果:
上面这个就是Length的用法,Length就是用来得到一个数字的长度,在许多情况下我们都是不可能知道数组的长度的,所以有了数组名.Length就方便多了。
接下来我们看一下排序,对于排序我想大家第一感觉想到的就是冒泡排序了,好的接下来我们就看一下冒泡排序,首先来了解一下冒泡排序的概念(概念来自百度文库):
依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
以上就是冒泡排序的概念,概念毕竟是概念,我感觉没有例子说明的更清楚些;好的,我们还是用例子来说话:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 int[] change = { 23, 11, 54, 33, 7 };
6 int length = change.Length;//得到数组的长度
7 int i;
8 Console.WriteLine("冒泡排序前:");
9 for (i = 0; i < length; i++)//循环输出排序前的值
10 {
11 Console.WriteLine("{0}", change[i]);
12 }
13 //下面进行冒泡排序(降序)
14 for (i = 0; i < length - 1; i++)
15 {
16 for (int j = 0; j < length - i - 1; j++)
17 {
18 //如果数组中相邻的两个元素前面的大于后面的,那么进行交换。
19 if (change[j] < change[j + 1])
20 {
21 int empty = change[j];
22 change[j] = change[j + 1];
23 change[j + 1] = empty;
24 }
25 }
26 }
27 Console.WriteLine("冒泡排序后:");
28 for (i = 0; i < length; i++)
29 {
30 Console.WriteLine("{0}", change[i]);//循环输出冒泡排序结果
31 }
32 Console.ReadKey();
33 }
34 }
运行结果:
对于数组的排序有好多种方法,上面这种是最常规的方法,当然在Array类中有两个方法就是专门来完成排序的,一会我们再来看这两方法,下面我们还是来看一下语法吧,只要搞懂语法了,就可以自己随便排序了。
冒泡排序语法:
for (int i = 0; i < 数组长度 - 1; i++)
{
for (int j = 0; j < 数组长度 - i - 1; j++)
{
if (数组名[j] < 数组名[j + 1])
{
int empty = 数组名[j];
数组名[j] = 数组名[j + 1];
数组名[j + 1] = empty;
}
}
}
上面这个语法是降序排序,如果想升序的话就把if(数组名[j]<数组名[j=1])里面的小于号“<”改成大于号“>”就可以了。
刚才我们说到了Array类中的两个排序的方法,下面我们就简单的介绍一下Array类中的这两个方法。
在Array中实现升序排列的方法是Array.Sort(数组名),比如:Array.Sort(change).当然了降序也有Array.Reverse(数组名),比如:Array.Reverse(change),这个Reverse就是把数组的排序颠倒过来,也叫反转。
下面我们就把这两个方法放到实例中看看效果:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 int[] change = { 23, 11, 54, 33, 7 };
6 int length = change.Length;//得到数组的长度
7 int i;
8 Console.WriteLine("Array排序前:");
9 for (i = 0; i < length; i++)//循环输出排序前的值
10 {
11 Console.WriteLine("{0}", change[i]);
12 }
13 //下面是Array.Sort升序排列
14 Array.Sort(change);
15 Console.WriteLine("Array.Sort排序后:");
16 for (i = 0; i < length; i++)
17 {
18 Console.WriteLine("{0}", change[i]);//循环输出Array.Srot升序排列结果
19 }
20 //下面是Array.Reverse降序排列后
21 Array.Reverse(change);
22 Console.WriteLine("Array.Reverse排序后:");
23 for (i = 0; i < length; i++)
24 {
25 Console.WriteLine("{0}", change[i]);//循环输出Array.Reverse降序排列结果
26 }
27 Console.ReadKey();
28 }
29 }
运行结果:
冒泡排序和Array类中的两个方法排序实现出来的效果是相同的,不过相比而言冒泡排序的通用性很强,而且使用范围也比较广,还是希望大家多采用冒泡排序。
总结:1.数组的创建;
2.数组的长度;
3.冒泡排序;
4.Array类的两个方法;
以上就是本次的分享,可能内容比较少,但是只要把它都很好的掌握了,我觉得也是一种进步,知识在于积累嘛!对吧!Ok!The end!
此文是本人的个人观点,如有不完善或者不准确的地方,欢迎高手进行批评,老鸟进行指点。