写在前面
本文学习内容来自《算法图解》一书及百度百科内容
算法是一组完成任务的指令。任何代码片段都可视为算法。 —— 摘自《算法图解》
选择排序
以下内容摘自百度百科
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
思路梳理
假如你现在在一家新闻媒体公司工作,今天一共有5条新闻,老板现在叫你把这5条新闻按照浏览量最多的排在前面,
你会怎么去做?
新闻标题 | 浏览量 |
---|---|
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 | 3336 |
2.唐嫣被问想不想变矮一点,她的回答很耿直 | 14564 |
3.“逃犯克星”张学友将在洛阳开唱 警方:已准备好 | 42214 |
4.燃爆禾城—浙江康润助力张学友演唱会 | 8322 |
5.王大陆为张杰打call:认识了全世界最好男人 | 25584 |
一般我们会这样去实现这个需求:
- 遍历这个5条记录。
- 找出其中浏览量最大的放在一旁,放在一个新的地方,排在最前面。
- 从这5条记录里把那一条删除。
- 重复123步骤,遍历剩下的4条。找出····
选择排序是根据指定的条件(最大值或者最小值),取决你要排序的顺序,然后在指定的数组中,找到这个条件,把它从指定的数组中提取出来,放到一个新的数组里面,并把它从源数组中删除。
源数组 对其进行筛选,找出浏览量最大值提取出来放在 新数组 ,并在源数组中将其删除
源新闻中第三条新闻的阅读数最高 : 42214 我们把它拿出来放到了新数组的第一位
新闻标题(源数组) | 浏览量 | 新闻标题(新数组) | 浏览量 | |
---|---|---|---|---|
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 | 3336 | 1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好↑(3) | 42214 | |
2.唐嫣被问想不想变矮一点,她的回答很耿直 | 14564 | |||
4.燃爆禾城—浙江康润助力张学友演唱会 | 8322 | |||
5.王大陆为张杰打call:认识了全世界最好男人 | 25584 |
然后是排名第二浏览量的第五条新闻 25584 ,取出后放在新数组的第二位
新闻标题(源数组) | 浏览量 | 新闻标题(新数组) | 浏览量 | |
---|---|---|---|---|
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 | 3336 | 1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好↑(3) | 42214 | |
2.唐嫣被问想不想变矮一点,她的回答很耿直 | 14564 | 2.王大陆为张杰打call:认识了全世界最好男人↑(5) | 25584 | |
4.燃爆禾城—浙江康润助力张学友演唱会 | 8322 |
接下来的数据中,浏览量最多的新闻是第三条, 14564 我们把它拿出来放在新数组的第三位
新闻标题(源数组) | 浏览量 | 新闻标题(新数组) | 浏览量 | |
---|---|---|---|---|
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 | 3336 | 1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好↑(3) | 42214 | |
4.燃爆禾城—浙江康润助力张学友演唱会 | 8322 | 2.王大陆为张杰打call:认识了全世界最好男人↑(5) | 25584 | |
3.唐嫣被问想不想变矮一点,她的回答很耿直↓(2) | 14564 |
然后在把接下来最高的是 8322 我们把它取出,放在新数组的第三位
新闻标题(源数组) | 浏览量 | 新闻标题(新数组) | 浏览量 | |
---|---|---|---|---|
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 | 3336 | 1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好↑(3) | 42214 | |
2.王大陆为张杰打call:认识了全世界最好男人↑(5) | 25584 | |||
3.唐嫣被问想不想变矮一点,她的回答很耿直↓(2) | 14564 | |||
4.燃爆禾城—浙江康润助力张学友演唱会(4) | 8322 |
最后再把浏览量最小的第一条新闻,放在新数组的最后一位。至此完成了我们的《选择排序》
新闻标题(新数组) | 浏览量 |
---|---|
1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好 ↑(3) | 42214 |
2.王大陆为张杰打call:认识了全世界最好男人 ↑(5) | 25584 |
3.唐嫣被问想不想变矮一点,她的回答很耿直 ↓(2) | 14564 |
4.燃爆禾城—浙江康润助力张学友演唱会 (4) | 8322 |
5.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 ↓(1) | 3336 |
代码实现
Java
private static int[] selectionSort(int[] ints) {
int[] newInts = new int[ints.length];
for (int i = ints.length - 1; i >= 0; i--) {
int index = findBiggest(ints);
newInts[i] = ints[index];
ints = remove(ints, index);
}
return newInts;
}
private static int findBiggest(int[] ints) {
int biggest = ints[0];
int biggestIndex = 0;
for (int i = 1; i < ints.length; i++) {
if (ints[i] < biggest) {
biggest = ints[i];
biggestIndex = i;
}
}
return biggestIndex;
}
private static int[] remove(int[] ints, int index) {
int[] newArray = new int[ints.length - 1];
if (index > 0) {
System.arraycopy(ints, 0, newArray, 0, index);
System.arraycopy(ints, index + 1, newArray, index, newArray.length - index);
} else {
System.arraycopy(ints, index + 1, newArray, 0, newArray.length);
}
return newArray;
}
public static void main(String[] args) {
int[] ints = {3336, 14564, 42214, 8322, 25584};
ints = selectionSort(ints);
System.out.println("ints = " + Arrays.toString(ints));
}
// ints = [42214, 25584, 14564, 8322, 3336]
python
def findBiggest(arry):
biggest = arry[0]
biggest_index = 0
for index in range(1, len(arry)):
if arry[index] > biggest:
biggest = arry[index]
biggest_index = index
return biggest_index
def selectionSort(arry):
resultArry = []
for e in range(len(arry)):
index = findBiggest(arry)
resultArry.append(arry.pop(index))
return resultArry
print('ints =', selectionSort([3336, 14564, 42214, 8322, 25584]))
# ints = [42214, 25584, 14564, 8322, 3336]
选择排序是一种灵巧的算法,但其速度不是很快。