c#学习笔记-----数组、集合
1.0 概述
数组和集合是非常重要的数据结构(严格意义上集合好像不是基本的数据结构,我当初学的是严蔚敏版的c语言版本的数据结构(考研必备书籍),这本书没有把集合列为最基本的数据结构。),想必只有考过 计算机专业基础综合(专业代码:408)的人都知道数组不是一个很好玩的东西,我记得那个什么KMP算法就是练习数组的一个很好的例子!再过20多天,又不知道有多少人要死在 计算机专业基础综合这个大坑里!哈哈^_^!
fhbds!
1.1 数组声明
数组实际上是由一个变量名称表示一组同一类型的元素,是一种弱键值对关系!有了数组之后,对于批量操作一些同一类型的数据有很大的帮助,比如说你玩的三国杀,斗地主,你手里拿的就是一个数组或者集合!c#中数组有点风骚,不像Java中那样简单!c#中有矩形数组,还有交错数组!数组在使用之前需要声明和初始化!
矩形数组声明和初始化:
1 //声明数组 2 int [ ] array1;//声明一个一维数组 3 string[ , ] array2; //声明一个二维数组 (Java中这样声明是完全错误的!) 4 // string [2,3] array3;//编译报错 5 6 //初始化数组的方式 7 int [] array3 = new int[4]; 8 string [] array4 = {"无","心","无","信"}; 9 string [] array5 = new string[4] { "无", "心", "无", "信" };//显式 10 11 string [,] array6=new string [3,4]; //3x4 12 int[,] array7 = new int[,] { {1,2 }, {3,4 }, {5,6} }; //3x2 13 int[,] array8 = { { 7, 8,9}, { 10, 11, 12}, { 13, 14 ,15} };//子数组长度有限制,所有才有交错数组 14 15 //赋值 16 array3[0] = 1; 17 int i = array3[0]; 18 array6[2, 3] = "数组"; 19 string str = array6[2, 3]; 20 21 //textBox1.Text = i.ToString(); 22 //textBox1.Text =str;
交错数组声明初始化:
1 //交错数组(数组的数组) 2 int[][] jAarry1 = new int[3][];//jAarry1是3个int数组的 数组 3 4 jAarry1[0] = new int[] {1,2}; 5 jAarry1[1] = new int[] { 4,5,6 }; 6 jAarry1[2] = new int[] {7,8,9};
矩形数组和交错数组的区别:
1.2 数组的操作
数组是system.Array命名空间下的,比较完备的属性和功能如下,一些功能都是通过这些最基本的属性和封装好的方法来实现的(Java中叫API)。
数组的基本操作无外乎遍历,排序和查找!这三个操作就能实现很多的功能!
矩形数组的遍历:既可以用for来遍历(需要用到index的时候 use this ),也可以用foreach(只看数组中的元素),也可以直接Array.sort()。这些Java都支持(foreach 结构不是这样的),最近听说Java新出了一个非常牛X的方式来数组!
1 //数组遍历 2 3 //一维矩形数组 4 for (int k = 0; k < array4.Length;k++ ) { 5 // textBox1.Text += array4[k].ToString(); 6 } 7 8 foreach( var v in array4 ){ 9 //textBox1.Text += v.ToString(); 10 } 11 12 //多维矩形数组 13 for (int a = 0; a < array7.GetLength(0); a++) 14 { 15 for (int b = 0; b < array7.GetLength(1); b++) 16 { 17 //textBox1.Text += array7[a, b] + " ,"; 18 } 19 } 20 21 foreach (var v1 in array8) 22 { 23 // textBox1.Text += v1.ToString()+" ,"; 24 }
交错数组的遍历:
1 //交错数组 2 for (int i1 = 0; i1 < jAarry1.Length;i1++ ) { 3 for (int j1 = 0; j1 < jAarry1[i1].Length;j1++ ) { 4 // textBox1.Text += jAarry1[i1][j1].ToString()+" ,"; 5 } 6 } 7 8 foreach (var v2 in jAarry1) 9 { 10 foreach (var v22 in v2) { 11 //textBox1.Text += v22.ToString()+" ,"; 12 } 13 } 14
数组排序的方式有很多种,也可以基于数据结构中的希尔排序,选择排序,快速排序,基数排序.............,这些排序会在算法时空复杂度上,稳定性,实现上都各有差异,其中冒泡排序是最常使用的一种,冒泡排序是基于选择排序思想的!
1 //数组排序(冒泡排序) 2 int [] arr ={5,2,0,1,3,1,4,7,7}; 3 int temp; 4 for (int m = 0; m < arr.Length-1; m ++ ) { 5 for (int n = 0; n < arr.Length - m - 1;n++ ) 6 { 7 if (arr[n] > arr[n + 1]) 8 { 9 //temp = arr[n]; 10 //arr[n] = arr[n + 1]; 11 //arr[n + 1] = temp; 12 arr[n] = arr[n] ^ arr[n + 1]; 13 arr[n+1] = arr[n] ^ arr[n + 1]; 14 arr[n] = arr[n] ^ arr[n + 1]; 15 } 16 } 17 } 18 19 foreach( var vv in arr ){ 20 // textBox1.Text += vv.ToString()+" ,"; 21 }
其中使用^运算符会高效点!对于多维数组的排序一般是基于按行或者按列排序,实现价值不太大!
数组查找是一个非常重要的功能!查找,数据结构也有相应的算法,比较简单的就是顺序查找和折半查找,其中折半查找效率明显高于顺序查找!Java中也是这么去实现的!可以说一维矩形数组Java和c#是非常类似的!
1 //顺序查找 2 3 int num = 7; 4 int index = -2; 5 for (int ii = 0; ii < arr.Length; ii++) 6 { 7 if (arr[ii] == num) 8 { 9 //存在 索引值保存下来 10 index = ii; 11 break; 12 } 13 } 14 textBox1.Text += (index + 1).ToString() + " ,"; 15 16 //折半查找 17 int low = 0;//头指针 18 int high = arr.Length - 1;//尾指针 19 int index = -2; 20 int number = 10; 21 while (low <= high) 22 { 23 int mid = (low + high) / 2; 24 if (number > arr[mid]) 25 { 26 low = mid + 1; 27 } 28 else if (number < arr[mid]) 29 { 30 high = mid - 1; 31 } 32 else 33 { 34 index = mid; 35 break; 36 } 37 } 38 39 textBox1.Text += (index+1).ToString() + " ,";
2.1 集合
< not end >