文章目录
接上文
通过 二分搜索大家对算法应该有了初始的认识,前面提到二分搜索需要对有序数据进项操作
今天就来说说算法中经典的几种排序。
内存的工作原理
计算机就像是有很多抽屉的集合 , 每个抽屉都有地址可以理解为 标号。
如何有序存储这些数据呢,这里介绍 数组和链表 这两种基本的数据结构。
链表 和 数组
链表简单理解就是一个抽屉连着一个抽屉 ,他们不一定挨着 但是你可以顺着一个一个找到。
数组就是一排抽屉, 就像柜子一样。
简单地来说下优缺点
链表 | 数组 |
---|---|
增删快 | 改、查找快 |
那么为什么会出现这种情况呢。 大家想一下 数组在定义后相当于一个柜子你可以通过
下标也就是抽屉的标号轻松地找到一个抽屉但是对于链表你只能知道这个抽屉的下一
个抽屉是啥所以数组的查找速度高于链表
但是柜子的弊端也是显而易见的,假如随机抽出去一个抽屉那么这个柜子就少了一个
抽屉我如果还要维护之前的顺序 ,我就必须把所有的柜子全部往前移动一个位置。
同样的增加是一个道理
但是对于链表我们只需要把删除抽屉的上一个抽屉的链子直接连到 要删除抽屉的下一
个抽屉中
这里只是简单的说了下,关于数组和链表作为底层的数据结构很重要,有兴趣的从数据结构中详细的了解他们
选择排序
**举一个简单的例子**
一个班级里学生的成绩排序
我们可以 每一次挑出成绩最好的学生出来写到另外一张表上这一样依次操作
知道全部排完,大家可以思考操作了多少下。
每次挑选最大的都要全部看一遍,每挑完一次就要再挑一次 一共操作了 n^2 下
下面开始介绍选择排序,
示例代码 java
public void swap(int[] arr,int i,int j) {
int tempt = arr[i];
arr[i] = arr[j];
arr[j] = tempt;
}
public void SelectionSort(int[] arr){
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr,i,minIndex);
}
}
对于不同的语言可能有不同的实现方式例如python就可以使用在列表类似与java 的ArrayList为了节省内存,考虑基础差的同学给出上述代码。
供参考