一. 冒泡排序(重点)

思路:  每次比较把较小的放在前面, 大的放到后面;

图解:下图是最坏情况下的排序

`

冒泡排序m个元素, 就有(m-1)趟排序, 第一趟m-1次, 第二趟 m-2次....    总结下来就是趟数加上次数就等于总的元素数;

核心算法:

            int[] intNums = new int[] { , , , ,  };
int temp;
for (int i = ; i < intNums.Length - ; i++)
{
for (int j = ; j < intNums.Length - - i; j++)
{
if (intNums[j] > intNums[j + ])
{
temp = intNums[j];
intNums[j] = intNums[j + ];
intNums[j + ] = temp;
}
}
}
foreach (int item in intNums)
{
Console.WriteLine(item);
}

 优化:

上述我们写的代码有个很大的问题,  只有当数组初始排序是最坏情况的时候, 需要走完所有的趟数和次数. 初始排序的时候有一部分已经是有序的, 例如 {5, 1, 2, 3, 4}这样的一个顺序, 当执行完一趟的时候 我们其实已经得到了最终的结果, 没有必要再进行一趟趟的循环.

当数据量少的时候影响还不是很大, 但是如果数量上升到一定数量的时候这个时间就很可怕了. 因此我们可以对它进行一些优化; 当判断发到顺序已经排好了就可以终止循环, 那么如何来判断?

显而易见, 在一趟中没有发生任何交换的时候, 即内层for循环里的if如果没有被激活, 就代表顺序已经排好了.

如下, 我们可以用一个标签来判断:

            int[] intNums = new int[] { , , , ,  };
int temp;
bool tag = true; //定义一个tag标签 用来进行判断
// 在循环条件中加了一个与运算, 如果tag为true那么就继续进行循环, 如果为false就直接终止循环, 不用使用break来终止了;
for (int i = ; i < intNums.Length - && tag; i++)
{
tag = false; // 这里是必不可少的, 如果少了那么 tag 就会一直为真, 不会提前终止循环了.
for (int j = ; j < intNums.Length - - i; j++)
{
if (intNums[j] > intNums[j + ])
{
tag = true;
temp = intNums[j];
intNums[j] = intNums[j + ];
intNums[j + ] = temp;
}
}
}
foreach (int item in intNums)
{
Console.WriteLine(item);
}

二.选择排序

思路: 

以数组 array = {5, 4, 3, 2, 1}为例,:

第一趟用第一个元素和剩下的元素比较大小, 找到最小的数, 然后把它的下标和值记录下来, 这一趟结束后将其和第一个元素进行交换;

第二趟用第二元素和它之后的元素进行比较, 找到最小值, 最后再进行交换, 然后以此类推.

总的来说就是, 没有找到数组中最小的数,它依次放到前面来.

图解:

核心算法:

            int[] array = new int[] { , , , ,  };

            for (int i = ; i < array.Length - ; i++)
{
int min = array[i]; // min用来存放最小值
int index = i; // index就用来存放最小值的下标
for (int j = i + ; j <= array.Length - ; j++)
{
if (min > array[j])
{
min = array[j];
index = j;
}
}
array[index] = array[i];
array[i] = min; }
foreach (int item in array)
{
Console.Write(item + " ");
}

三.二分查找

查找元素是经常会用到的, 通常没有任何技巧的查找方法就是一个个遍历, 对比我们的期望元素. 这种查找方法有一个非常致命的缺点, 如果数据量过于庞大, 对性能的消耗非常大;

说明:二分查找又称为折半查找, 这种查找是有前提的:要查找的数组必须是有序的, 升序和降序均可; 以升序数组为例, 首先拿到已知元素(num)与数组中间位置的元素(mid)进行比较, 如果 mid > num, 说明 mid右边的数一定都比num大, 那么就可以把mid右边的数都pass, 直接从mid 左边的数里查找有没有num. 同理, 如果mid < num , 就说明mid左边的数都小于num , 就可以把它们都pass了. 这样反反复复知道查找到num为止.

图解:

核心算法:

            int[] sortNums = new int[] { , , , , , ,  };
int start = , end = sortNums.Length - ; // 定义开头和结尾的旗
Console.WriteLine("请输入你想要查找的数:");
int num = int.Parse(Console.ReadLine());
while(start <= end) // 如果start > end说明num不在 查找的数组里
{ int mid = (start + end) / ; // 每次都是开头结尾中间的元素和num比较
if (sortNums[mid] > num)
{
end = mid - ; }
else if(sortNums[mid] < num)
{
start = mid + ;
}
else
{
Console.WriteLine("查到了, 在第 {0} 个位置", mid + );
break;
}
}
if (start > end)
{
Console.WriteLine("对不起元素没有找到.");
}

四.二维数组(重点)

4.1二维数组的声明和初始化

声明

数据类型[,] = new 数据类型[行数, 列数];

初始化 : 分为动态初始化和静态初始化 , 花括号里面的各个花括号代表一行

第一种动态初始化:

int[, ] array = new int[, ] {{, , }, {, , }};

第二种动态初始化:

int[, ] array = new int[, ]  {{, , }, {, , }};

静态初始化:

int[, ] array = {{, , }, {, , }};

注意: 二维数组静态初始化定义时, 行数的个数可以是任意的, 但是列数的个数必须是相同的, 即 每个内层花括号中元素的个数必要要相同.

4.2 二维数组的遍历

C#中通过 GetLength方法可以得到二维数组的行数和列数

array.GetLength(0)  得到有多少行数;

array.GetLength(1) 得到有多少列数;

int[,] array = new int[, ] { { , ,  }, { , ,  } };
for(int i = ; i < array.GetLength(); i++)
{
for(int j = ; j < array.GetLength(); j++)
{
Console.Write(array[i, j] + " " );
}
Console.WriteLine();
}

 

练习

1.定义一个数组, 将该数组的转置存到另一个数组中;

            int[,] array = new int[, ] { { , ,  }, { , ,  } };
int[,] newArray = new int[array.GetLength(1), array.GetLength(0)];
for(int i = ; i < array.GetLength(); i++)
{
for(int j = ; j < array.GetLength(); j++)
{
newArray[j, i] = array[i, j];
}
} Console.WriteLine("转置为:");
for (int i = ; i < newArray.GetLength(); i++)
{
for (int j = ; j < newArray.GetLength(); j++)
{
Console.Write(newArray[i, j] + " ");
}
Console.WriteLine();
}

2.有一个3行4列的二维数组, 要求编程找出最大元素, 并输出所在的行和列.

           int[,] array = new int[,] { { , , ,  }, { , , ,  }, { , , ,  } };
int max = array[, ], r = , c = ;
for (int i = ; i < array.GetLength(); i++)
{
for (int j = ; j < array.GetLength(); j++)
{
if(max < array[i, j])
{
max = array[i, j];
r = i;
c = j;
}
}
}
Console.WriteLine("最大值为: {0}, 在{1}行 {2}列", max, r+, c+);

五.交错数组

5.1 交错数组中包含一维数组

声明:

int[][] array = new int[行数][列数];   行数必须写, 但是列数可以不写

初始化:

int[][] array = new int[][];
array[] = new int[] { , , , };
array[] = new int[] { , , };
array[] = new int[] { , };
// 赋值的时候必须动态赋值

int[][] array1 =
{
new int[] {1, 2, 3},
new int[] {3, 4, 5,6}
};

取值:

直接把写上行号和列号就可以, 例如, 如果我们要取 array1 中的元素2, 就可以写 array1[0][1];

遍历:

交错数组的遍历要比二维数组更简单一些, 交错数组可以被拆分开

            int[][] array = new int[][];
array[] = new int[] { , , , };
array[] = new int[] { , , };
array[] = new int[] { , }; for(int i = ; i < array.Length; i++)
{
for(int j = ; j < array[i].Length; j++)
{
Console.Write(array[i][j] + " " );
}
Console.WriteLine();
}

5.2 交错数组中包含二维数组

这个直接上代码会比较清晰

声明:

取值:

遍历:

C#学习笔记04--排序/查找/二维数组/交叉数组的更多相关文章

  1. Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式

    递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...

  2. Java-J2SE学习笔记-字符串转化为二维数组

    1.字符串转化为二维Double数组 2.代码: package Test; public class TestDouble { public static void main(String[] ar ...

  3. 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  4. Arcgis api for javascript学习笔记(4.6版本) - 二维MapView中的FeatureLayer显示标注

    4.6版本api的FeatureLayer中有提供 labelsVisible 和 labelingInfo 两个属性,设置这两个属性可以实现显示将属性中某个字段作为标注.但是这两个属性只针对三维Sc ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader) 代码工 ...

  6. Redis:学习笔记-04

    Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...

  7. 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)

    机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...

  9. vue2.0学习笔记之路由(二)路由嵌套+动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 2019年Unity学习资源指南[精心整理]

    前言 进入一个领域,最直接有效的方法就是,寻找相关综述性文章,首先你需要对你入门的领域有个概括性的了解,这些包括: 1.主流的学习社区与网站. 2.该领域的知名大牛与热心分享的从业者. 3.如何有效的 ...

  2. API 网关知识看这篇就足够了!

    本文已经收录自 JavaGuide (60k+ Star[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.) 本文授权转载自:https://github.com/java ...

  3. linux lsof 查看进程打开那些文件 或者 查看文件给那个进程使用

    lsof命令是什么? 可以列出被进程所打开的文件的信息.被打开的文件可以是 1.普通的文件,2.目录  3.网络文件系统的文件,4.字符设备文件  5.(函数)共享库  6.管道,命名管道 7.符号链 ...

  4. H5 + WebGL 实现的楼宇自控 3D 可视化监控

    前言 智慧楼宇和人们的生活息息相关,楼宇智能化程度的提高,会极大程度的改善人们的生活品质,在当前工业互联网大背景下受到很大关注.目前智慧楼宇可视化监控的主要优点包括: 智慧化 -- 智慧楼宇是一个生态 ...

  5. PL/SQL软件执行命令出现动态执行表不可访问,本会话的自动统计被禁止

    出现这样的原因是该用户没有相关权限. 解决方法: 去除软件层面设置

  6. [考试反思]0907NOIP模拟测试39:角落

    题比较简单,但是做的非常烂. T1是个愚蠢的找规律组合数快速幂,数组开小了(看错数据范围) T2题目保证联通没看见,hack掉了正解. T3也挺蠢的,但是打乱了,思路不是很清晰导致丢了50分. 只能说 ...

  7. phpexcel导出数字带E的解决方法

    phpexcel导出数字带E的解决方法 excel之所以带E 是因为按照数字格式来显示了(数字过长的时候) 数字左边或者右边加空格就变成字符串了 那么excel就会按照字符串格式来显示了 就不会带E了

  8. 深入理解计算机系统 第二章 信息的表示和处理 part1

    欣哥划的重点: 第二章比较难,建议至少掌握下面几个知识点: 1. 字节顺序 : 大端和小端 2. 运行 图2-24, 图2-25程序 show-bytes.c 观察结果,看看有什么问题 3. 理解布尔 ...

  9. PHP+Swoole并发编程的魅力

    PHP语言是一个短生命周期的Web编程语言,很多PHPer已经形成了fpm下编程的思维定势.实际上在Swoole出现之后,这种串行化编程的模式早已被打破.使用Swoole完全可以轻易实现更灵活的并发编 ...

  10. SQL的四种连接(左外连接、右外连接、内连接、全连接)

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...