forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.3 KiB
45 lines
1.3 KiB
3 years ago
|
# 选择排序 `非原地排序` `推荐`
|
||
|
|
||
|
* **介绍**
|
||
|
* 复杂度O(n<sup>2</sup>)
|
||
|
* `不推荐`~~过程:~~~~分趟查询最小值,将值插入到新数组,原数组移除该趟相对最小值.~~
|
||
|
* `推荐`过程:一趟排序最小的数,放到第一个位置; 在一趟在无序区记录最小的数,放置第二个位置; ... ...
|
||
|
* 关键词
|
||
|
* 有序区和无序区
|
||
|
* 无序区最小数的位置
|
||
|
* 数值对调
|
||
|
* **原理**
|
||
|
* 1、对于给定的一组记录,经过第一轮比较后得到最小的记录;
|
||
|
* 2、将该记录的位置与第一个记录的位置交换;
|
||
|
* 3、对不包括第一个记录以外的其他记录进行第二次比较,得到最小记录并与第二个位置记录交换;
|
||
|
* 4、重复该过程,知道进行比较的记录只剩下一个为止。
|
||
|
|
||
|
* **代码**
|
||
|
|
||
|
```go
|
||
|
/**
|
||
|
Select 实现选择排序 O(n * n)
|
||
|
a : 被排序数组
|
||
|
返回:排序完毕数组
|
||
|
*/
|
||
|
func Select(a []int) []int {
|
||
|
for i,j := 0, len(a); i < j; i++ { // 循环列表元素每一个元素
|
||
|
theMin := i // 记录最小值记录
|
||
|
for ii := i + 1; ii < j ; ii++ { // 循环无序列表部分
|
||
|
if a[theMin] > a[ii] { // 较大的值移至后边
|
||
|
theMin = ii // 较大的值移至后边
|
||
|
}
|
||
|
}
|
||
|
if theMin != i {
|
||
|
a[i], a[theMin] = a[theMin], a[i]
|
||
|
}
|
||
|
}
|
||
|
return a
|
||
|
}
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
* **过程**
|
||
|
|
||
|
![选择排序](.\img\选择排序.gif)
|