值类型 引用类型 排序 二维数组 foreach遍历

值类型与引用类型

值类型:int bool ······ 枚举 结构体 这些都是值类型
引用类型:字符串 数组 类

要说这个就要从CPU说起,CPU里有缓存 分一级缓存,二级缓存
其中一级缓存速度最快
栈放在一级空间
堆放在二级空间

在这里插入图片描述

可以参考上图(一波灵魂的画图。。。)
而值类型与引用类型最大的区别就是 
值类型在栈空间里开辟,如果我现在这样写int a = 10; int b = a;这是在做赋值把a的值赋给b 那么他会在栈里边在开辟一块空间来存储 
虽然存储的结果是一样的,但是我修改任何单独的一个,都不会影响到另一个,比如我把b的值改为20,那么a的值还是10
引用类型就刚好相反,因为引用类型在栈里存储的是堆的地址,如果我现在写string str1 = "abc"; string str2 = str1;  那么str1和str2指向的都是堆里的同一块地方

数组的小练习题

int[] array = {2,3,4,5,6,7}
/*
	要求(1) 把这个数字反向打印出来 意思就是结果要在控制台打成7,6,5,4,3,2,1
	要求(2) 求数组所有元素的和  加在一起就好 先声明一个新的变量默认值0,然后在循环里 加在一起最后打印 完美!!
*/
//第一小问
//肯定要先写一波for循环
//要倒序,就要从他的总长度开始-1
//不能数组越界访问到0号元素就停止
//--计数
for(int i = array.Length - 1; i >= 0; i--){
    //打印array[i],控制台显示结果
    Console.WriteLine(array[i]);
}
//第二小问
//声明一个新的变量,用来存储数组相加在一起
int a = 0;
//条件可以不用变,直接用第一问的就好
for(int i = array.Length - 1; i >= 0; i--){
    //这是灵魂所在 ,我知道有人看不懂 这样写也行 a = a + array[i]; 这两句话的意思是一样的!!!
    a += array[i];
}
//最后打印一下
Console.WriteLine(a);

排序

冒泡排序

在这里插入图片描述

冒泡排序的主要逻辑是先拿第一个数12和第二个数35进行比较,如果结果是12小 ,那就交换,如果结果比第二个数要大,就不交换,然后拿第二个数和后面继续比较,直到确定出一个最大的数放在最后一个。然后进入下一轮循环,直到彻底排完序。
举个例子:
比较了几轮					数据 5 1 3 2 0					比较了几次
    0					 		1 3 2 0 5						4
    1					 		1 2 0 3 						3 
    2					 		1 0 2   						2
    3					 		0 1     						1
    					 		0 1 2 3 5						
int[] a;
a.Length 数组长度的意思
轮数 Length - 1
次数 Length - 轮数 - 1
//举个例子 
int[] array = {3,2,6,5,4,7};
//冒泡排序
//轮数
for(int i = 0;i < array.Length - 1;i++){
    //次数
    for(int j = 0;j < array.Length - i - 1;j++){
        //如果当前的数大于他后面的那个数
        if(array[j] > array[j+1]){
            //交换 需要个临时变量
            int tmp = array[j];
            array[j] = array[j+1];
            array[j+1] = tmp;
        }
    }
}
//循环打印
for(int i = 0; i < array.Length; i++){
    Console.WriteLine(array[i]);
}

选择排序

选择排序每一轮选一个最小的数放在前面, 比如 5和1 嗯 1小 然后我不交换,只是单纯的记录一下,然后拿1和后面进行比较,到最后0的时候,0最小了,要放在前面0和5做一个交换
举个例子:
比较了几轮					数据 5 1 3 2 0					比较了几次
    0					 		0 1 3 2 5						4
    1					 		  1 3 2 5 						3 
    2					 		    2 3 5   					2
    3					 		      3 5     					1
    					 		0 1 2 3 5						
//选择排序
for(int i = 0; i < array.Length - 1; i++){
    //记录当前拿的是哪一个数,位置是多少
    int index = i;
    int num = array[i];
    //i + 1是看的纵列数据的位置 第一行记录的是0 第二行记录1 都是拿后面的数和后面进行比较
    //j < array.Length 这句话意味着比较到哪个位置,如果写j <= array.Length或者j < array.Length - 1结果都是不对的
    for(int j = i + 1;j < array.Length;j++){
        //比较
        //用前面的数和后面的比较
        if(num > array[i]){
            //如果后面的比前面的小,就记录他
            index = j;
            num = array[j];
        }
    }
    //交换位置
    //声明一个临时变量
    int tmp = array[i];
    array[i] = num;
    array[index] = tmp;
}
//循环打印
for(int i = 0; i < array.Length; i++){
    Console.WriteLine(array[i]);
}

插入排序

插入排序 就类似玩扑克牌,拿到第一张(这里叫第一个数)的时候先不用看,等拿到第二个数进行比较,如果新拿的数比第一个数大就放后面,比第一个数小就放前面
举个例子:
比较了几轮					数据 5 1 3 2 0					比较了几次
    0					 	    5      			     			0
    1					 		1 5     						1
    2					 		1 3 5        					2
    3					 		1 2 3 5     					3
    4					 		0 1 2 3 5					    4
//插入排序
for(int i = 0; i < array.Length - 1;i++){
    //int j = i + 1这句话的意思是 直接忽略第零轮,直接从第一轮开始与第一个数比较
    //j-- 是因为次数是反向的
    for(int j = i + 1; j > 0;j--){
        //后面的数比前面的小,交换
        if(array[j] < array[j-1]){
            //临时变量 交换
            int tmp = array[j];
            array[j] = array[j-1];
            array[j-1] = tmp;
        }
    }
}
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}

二维数组

也可以叫多为数组,因为他几维数组都可以

声明 第一维长度,第二维长度

int[,] array = new int[2,3]{ { 1, 2, 3 } , { 1, 2, 3 }} ;
int[,] map = new int[,]{ { 1, 2, 3 }, { 4, 5, 6 } };
Int[] a = {1,2,3,4,5}; int[] b = {6,7,8,9,10};
{{1,2,3,4},{4,5,6,7},{7,8,9,10}}

Int[,] array = new int[3,4];
Int[,] array = new int[3,4] {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
Int[,] array = new int[,] {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
Int[,] array = {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
Array[1,3]; [2,2];

Int[,,] array = {{{1,2},{2,3}},{{},{}},{{},{}}};


随手笔记    在别的语言里 二维数组 有a[0][1] 这样写的   在c#里a[0,1]

foreach 遍历

//迭代类型var 必须和后面的迭代集合匹配,也可以使用模糊数据类型var
//注意foreach不能修改值,只能读取
foreach (迭代类型 迭代变量名 in 迭代集合)
{
    //循环体
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值