图解算法笔记|选择排序
1. 内存的工作原理
计算机就像很多抽屉的集合体,每个抽屉都有各自的地址,需要将数组存储到内存时,需要请求计算机提供存储空间,计算机给你一个存储地址.存储多项数据时,有两个基本的数据结构--数组和链表
2. 数组和链表
数组是一段连续的存储空间,因为是连续的,所以读取的时候会比较容易,使用等差即可获取An=A0+(n-1)即可获取目标位置,但是新增元素的时候,比较麻烦,需要预留空间,当所有的空间都填满时,就无法继续添加元素了,只能重新开辟一段新的,更大的空间.
如果是频繁插入的操作可以使用链表进行存储,链表中每个元素都存储着下一个元素的位置,存储他们的位置是不连续的,链表与数组相比有他的优势,第一个是他的容量仅首先与内存空间, 另外对于随机位置插入数据来说更方便,因为数组的话如果不是尾部,而是中间,会让插入位置后面的数据整体发生移动,而链表则不会.但是他也有缺点,那就是查询某一个元素,比如要读取第五个元素,必须从头开始查询地址,最终获取第五个元素的地址.读取的时间复杂度为O(n),而数组读取元素为O(1), 插入操作则相反.
数组的支持随机访问和顺序访问,链表只支持顺序访问,所谓的随机访问是指,我可以直接确定某一个位置的地址,而不是从头开始找.
3.选择排序
选择排序就是遍历列表,然后找到最小(最大的)元素,然后将其放到新的变量容器中,循环执行n次,就能得到一个排序好的列表
代码实现:
php:
<?php
// 选择排序
function findSmallest($arr){
$index = 0;
$smallest=$arr[0];
foreach($arr as $k=>$v){
if($v< $smallest){
$smallest=$v;
$index = $k;
}
}
return $index;
}
function selectSort($arr){
$resArr = [];
$len = count($arr);
for ($i=0;$i<$len;$i++){
$index = findSmallest($arr);
array_push($resArr,$arr[$index]);
unset($arr[$index]);
$arr = array_values($arr);
}
return $resArr;
}
$arr = [1,23,4,5,2];
$res = selectSort($arr);
var_dump($res);
golang:
package main
import "fmt"
func main() {
data := []int{1, 2, 0, 34, 23, 99}
res := selectSort(data)
fmt.Println(res)
}
func findSmallest(data []int) int {
small_index := 0
smallest := data[0]
for index, value := range data {
if value < smallest {
small_index = index
}
}
return small_index
}
func selectSort(data []int) []int {
var res []int
var len = len(data)
for i := 0; i < len; i++ {
index := findSmallest(data)
res = append(res, data[index])
data = append(data[:index], data[index+1:]...)
}
return res
}
python:
def findSmallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(1,len(arr)):
if arr[i]<smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
def selectSort(arr):
newArr = []
for i in range(len(arr)):
smallest=findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr
print (selectSort([1,2,30,3,55]))