图解算法笔记|选择排序

183 阅读2分钟

图解算法笔记|选择排序

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]))