/*
*
* 学习数组
* 数组在有些书里面称之为引用类型,更确切的说数组是一种数据结构.
*
*/
using System;
using System.Collections;
namespace 数组
{
class Person
{
public string name;
public string age;
public Person(string name,string age){
this.name = name;
this.age = age;
}
}
class MainClass
{
public static void Main (string[] args)
{
//******************************************************************* 最基本的数组 ---------掌握
//数组的定义:存储相同数据类型的集合.
//定义了一个长度为4的整型数组,这个数组只可以存整行数据
//第一种写法:动态分配内存空间
// int[] intArray = new int[4];
//第二种写法
// int[] intArray = new int[]{1,2,3,4};
//注意:初始化数组的时候,要么给定长度,要么初始化数组内的元素个数.
//第三种写法
// int[] intArray = {1,2,3,4};
//实际上我们int[] 它的原型为 Array
//而int[] 数组可以用foreach循环的原因归根结底为,Array类本身已经实现了IEnumrable这个接口.
//所以int[] 才可以用foreach循环
//访问数组的元素
//访问数组第0个位置存储的元素
// Console.WriteLine("数组第0个位置存储的元素为:" + intArray[0]);
//访问数组第4个位置存储的元素----- 访问越界(程序崩溃)
// Console.WriteLine ("数组第4个位置存储的元素为:" + intArray [4]);
//遍历数组1
// for (int i = 0; i < intArray.Length; i++) {
// Console.WriteLine ("下标:{0},值为:{1}", i, intArray [i]);
// }
//遍历数组2
// foreach (int item in intArray) {
// Console3.WriteLine ("数组的元素为:" + item);
// }
//如何修改数组中的元素呢?
//通过索引取值进行赋值
// intArray[2] = 10.0f; 这是错误的因为数据类型不对
// intArray[2] = 10;
//
// //遍历数组2
// foreach (int item in intArray) {
// Console.WriteLine ("数组的元素为:" + item);
// }
//练习1:分别声明string,char,float,double相应类型的数组,进行遍历访问.
// string[] s = { "Hello", "World" };
// char[] c = { 'H', 'e', 'l', 'l', 'o' };
// float[] f = { 1.0f, 2.0f, 3.0f };
// double[] d = { 1.11f, 2.22f, 3.33f };
//***************************************************** 对象类型的数组(了解)
// Person[] persons = new Person[] {
// new Person("小伟","18"),
// new Person("小伦","19")
// };
//
// foreach (Person p in persons) {
// Console.WriteLine ("姓名:{0}年龄:{1}", p.name, p.age);
// }
//***************************************************** Array抽象类型的抽象数组(了解)
// Array arr = Array.CreateInstance (typeof(int), 5);
// arr.SetValue (1, 0);
// arr.SetValue (2, 1);
// arr.SetValue (3, 2);
//
// for (int i = 0; i < 5; i++) {
// Console.WriteLine (arr.GetValue(i));
// }
//
// //把arr数组转换成int[]数组
// int[] newIntArray = (int[])arr;
//
// foreach (int item in newIntArray) {
// Console.WriteLine (item);
// }
//练习2:分别定义练习1类型对应的Array数组,设置数组元素,并且遍历所有元素
//**************************************************************************** ArraySegment<T>
// ArraySegment<T>
// int[] intArray1 = { 1, 2, 3, 4 };
// int[] intArray2 = { 5, 6, 7, 8 };
//
// var se1 = new ArraySegment<int>[2] {
// new ArraySegment<int>(intArray1,0,3),
// new ArraySegment<int>(intArray2,3,1)
// };
//
// ArraySegment<int> se = (ArraySegment<int>[])se1;
// Print (se1);
//*****************************************************************************
//练习3:找出数组中最大值,以及最大值所在的位置(至少5个数)
// int max = 0;
// int maxIndex = 0;
// int[] intArray = { 6, 10, 88, 1, 2 };
// for (int i = 0; i < intArray.Length; i++) {
// if (intArray [i] > max) {
// max = intArray [i];
// maxIndex = i;
// }
// }
// Console.WriteLine ("最大值为:{0}", max);
// Console.WriteLine ("最大值所在的位置:{0}", maxIndex);
//练习4:定义一个整型数组,初始化3个整型元素,打印出最大值,最小值,以及平均值.
// int[] a = new int[]{1,4,7,};
// int max = a [0],min=a[0],sum=0;
// for (int i = 0; i < a.Length; i++) {
// if (max<a[i]) {
// max = a [i];
// }
// if (min>a[i]) {
// min = a [i];
// }
// sum += a [i];
// }
// Console.WriteLine ("a数组中的最大值为{0},最小值为{1},平均值为{2}",max,min,sum/a.Length);
//练习5:定义一个数组,从键盘上获取三个整型数值,打印出最大值
// int[] a=new int[3];
// for (int i = 0; i < a.Length; i++) {
// a [i] = int.Parse (Console.ReadLine());
// }
// int max1=a[0];
// for (int i = 0; i < a.Length; i++) {
// max1=a[i]>max1?a[i]:max1;
// }
// Console.WriteLine ("最大值为:{0}",max1);
//练习6:拼接两个字符串数组,到一个数组,遍历显示
// string[] stringNum1 = {"你好","哈哈"};
// string[] stringNum2 = { "我不好", "才怪" };
// string[] stringNum3 = new string[stringNum1.Length + stringNum2.Length];
//
// for (int i = 0; i < stringNum1.Length; i++)
// {
// stringNum3 [i] = stringNum1 [i];
// }
//
// for (int j = 0; j < stringNum2.Length; j++)
// {
// stringNum3 [stringNum1.Length+j] = stringNum2 [j];
// }
//
// foreach (string item in stringNum3)
// {
// Console.WriteLine (item);
// }
// ArrayList
// 数组排序 -- 自己的算法
// Stopwatch sw = new Stopwatch();
// int[] intArray = {10,9,8,7,6,5,4,3,2,1};
// sw.Start ();
// for(int i = 0;i < intArray.Length - 1 ;i++){ //
// for (int j = 0; j < intArray.Length -1 - i; j++) {
// if (intArray[j] > intArray[j + 1]) {
// int temp = intArray [j];
// intArray [j] = intArray [j + 1];
// intArray [j + 1] = temp;
// }
// }
// }
// sw.Stop ();
// Console.WriteLine ("时间是{0}",sw.Elapsed);
// foreach (var item in intArray) {
// Console.WriteLine (item);
// }
// // 如何使用系统内置的排序
// sw.Start();
// Array.Sort(intArray);
// sw.Stop ();
// Console.WriteLine ("时间是{0}",sw.Elapsed);
// foreach (var item in intArray) {
// Console.WriteLine (item);
// }
// 课后拓展:桶排序(啊哈算法)
// 练习 :(1) 整数数组冒泡排序
// (2) 字符串数组,Array.sort()排序
// int[] a = { 18, 56, 12, 9, 45, 72, 33, 6, 43 };
// for (int i = 0; i < a.Length - 1; i++) {
// for (int j = 0; j < a.Length - 1 -i; j++) {
// if (a[j] > a[j + 1]) {
// int temp = a [j];
// a [j] = a [j + 1];
// a [j + 1] = temp;
// }
// }
// }
// foreach (var item in a) {
// Console.WriteLine (item);
// }
// string[] s = { "H", "J", "L", "F", "R" };
// Array.Sort (s);
// foreach (var item in s) {
// Console.WriteLine (item);
// }
// 二维数组
// int[,] twodim = new int[3,3];
// twodim [0, 0] = 1;
// twodim [0, 1] = 2;
// twodim [0, 2] = 3;
//
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < 3; j++) {
// Console.Write (twodim[i,j]+ " ");
// }
// Console.WriteLine ();
// }
/*
* 4 8 9 6 0
* 7 4 22 11 4
* 90 8 65 32 1
* 12 5 2 8 0
*/
// 第一种定义:二维数组
// int[,] twodim = { { 4, 8, 9, 6, 0 }, { 7, 4, 22, 11, 4 }, { 90, 8, 65, 32, 1 }, { 12, 5, 2, 8, 0 } };
// for (int i = 0; i < 4; i++) {
// for (int j = 0; j < 5; j++) {
// Console.Write (twodim[i,j]+ " ");
// }
// Console.WriteLine ();
// }
//第二种定义二维数组的方法
//锯齿数组
// int[][] twodim = new int[3][];
// twodim [0] = new int[]{ 1, 2, 3 };
// twodim [1] = new int[]{ 1, 2, 3, 4};
// twodim [2] = new int[]{ 1, 2, 3, 4, 5};
// for (int i = 0; i < twodim.Length; i++) {
// for (int j = 0; j < twodim[i].Length; j++) {
// Console.Write (twodim[i][j] + " ");
// }
// Console.WriteLine ();
// }
// 总结二维数组
// 第一种声明格式:int[,] 遍历访问的时候要采取arr[i,j]的方式进行访问
// 第二种声明格式:int[][] 这种写法的二维数组实际上是由多个一维数组构成,可以不声明
// 列数,但是必须声明行数,访问方式是arr[i][j]
// 练习1:采用int[,]方式进行声明数组并初始化,遍历数组元素
// int[,] a = { { 3, 5, 8, 15, 4 }, { 2, 7, 6, 56, 1 }, { 33, 42, 9, 2, 1 }, { 27, 10, 16, 38, 55 } };
// for (int i = 0; i < 4; i++) {
// for (int j = 0; j < 5; j++) {
// Console.Write (a[i,j] + " ");
// }
// Console.WriteLine ();
// }
// 练习2:采用int[][]方式进行声明并初始化,遍历数组元素
// int[][] a = new int[4][];
// a [0] = new int[]{3, 5, 8, 15, 4};
// a [1] = new int[]{ 2, 7, 6, 56, 1 };
// a [2] = new int[]{ 33, 42, 9, 2, 1 };
// a [3] = new int[] { 27, 10, 16, 38, 55 };
// for (int i = 0; i < 4; i++) {
// for (int j = 0; j < 5; j++) {
// Console.Write (a[i][j] + " ");
// }
// Console.WriteLine ();
// }
// 练习3:有一个3行4列的二维数组,要求编程找出最大元素,并输出所在的行和列
// int[][] a = new int[3][4];
// int i, j, t, s, b;
// Console.WriteLine ("输入25个数");
// for ( i = 0; i < 4; i++) {
// for ( j = 0; j < 5; j++) {
// Console.WriteLine (a[i][j]);
// }
// }
// t = a [0] [0];
// for ( i = 0; i < 4; i++) {
// for ( j = 0; j < 5; j++) {
// if (t < a[i][j]) {
// t = a [i] [j];
// s = i;
// b = j;
// }
// }
// Console.WriteLine ("最大数是{0}",t);
// Console.WriteLine ("位置是{}行{}列",s,b);
// }
// int[,] a = {
// { 3, 5, 8, 15, 4 },
// { 2, 7, 6, 56, 1 },
// { 33, 42, 9, 2, 1 },
// { 27, 10, 16, 38, 55 }
// };
// int t= 0;
// int t2 = 0;
// int max = a [0, 0];
// for (int i = 0; i < 4; i++) {
// for (int j = 0; j < 5; j++) {
// if ( a[i,j] > max) {
// max = a [i, j];
// t = i;
// t2 = j;
// }
// }
// }
// Console.WriteLine ("最大数{0} 在{1}行{2}列",max,t,t2);
// clone ---会创建一个新的数组出来,他会在托管堆开辟内存空间
// int[] intOriginArray = new int[4];
// intOriginArray [0] = 1;
// intOriginArray [1] = 2;
// intOriginArray [2] = 3;
// intOriginArray [3] = 4;
// // 演示clone方法
// int[] newArray = (int[]) intOriginArray.Clone();
// // 遍历newArray
// foreach (var item in newArray) {
// Console.WriteLine (item);
// }
// copy----容器数组的长度必须大于或等于原数组的长度要保持一致
// (前拷贝和深拷贝的区别)
// int[] intOriginArray = new int[4];
// int[] newArray = { 1, 2, 3, 4 };
// newArray.CopyTo (intOriginArray, 0);
// foreach (var item in intOriginArray) {
// Console.WriteLine (item);
// }
}// static void Print(ArraySegment<int>[] segements)// {// foreach (var segement in segements) // {// for (int i = segement.Offset; i < segement.Offset + segement.Count; i++) {// Console.WriteLine (segement.Array [i]);// }// }// }}}