处理步骤
步骤是从原始数据中依次找出最小数据并放入到较前面的位置,步骤分析,
- 拿第一个数据和第一个数据后的所有数据做比较,找到第一个数据和剩余数据中最小的数据并做位置替换
- 拿第二个数据和和第二个数据之后的所有数据做比较,同样是找到最小值并替换位置
- 重复此步骤
-
演示过程
选择排序的过程如下:
-
代码实现
python ```python
选择排序
class SelectionSort: def init(self, data: list):
assert len(data) > 0, "data length must > 0"self.__data = data
def sort(self) -> list:
for i in range(len(self.__data)):# 查找 data[i:len(data)]中的最小元素 ,在查找前可以假定data[i]最小min_index = ifor j in range(i + 1, len(self.__data)):# 剩余数据中存在比当前值小的值 替换最小下标if self.__data[j] < self.__data[min_index]:min_index = jif min_index != i:self.__swap(i, min_index)return self.__data
交换数组中位置为 i 和 j 的数据
def __swap(self, i: int, j: int):
self.__data[i], self.__data[j] = self.__data[j], self.__data[i]
if name == ‘main‘: selectSort = SelectionSort([1, 8, 7, 2, 3, 9, 5]) print(selectSort.sort())
- go go代码基本和python的实现过程一致```gopackage mainimport ("fmt""math/rand""time")type Sort interface {sort()swap(int ,int)}type SelectSort struct {// 待排序和排序后的数据Data []int}func Data(num int,max int,isSort bool) []int {/*num 数据量max 取值范围 0 - maxisSort 是否有序*/var array []intif isSort{for i := 0; i < num; i++ {array = append(array, num)}}else {for i := 0; i < num; i++ {array = append(array, rand.Intn(max))}}return array}// 统计算法执行时间 可用于做算法执行时间对比func TimeTools(sort Sort,funcName string,dataNum int) {startTime := time.Now()sort.sort()elapsed := time.Since(startTime)fmt.Printf("%s --> data: %d times %v \n",funcName,dataNum,elapsed)}func (sort *SelectSort) sort() {for i:=0;i<len(sort.Data);i++{for j:=i+1;j<len(sort.Data);j++{var minIndex = iif sort.Data[j] < sort.Data[minIndex]{minIndex = j}if minIndex!=i{sort.swap(i,j)}}}}// 交换data中 i j位置上的数据func (sort *SelectSort)swap(i int,j int) {sort.Data[i],sort.Data[j] = sort.Data[j],sort.Data[i]return}func main() {var data []intdata = Data(20,100000,false)selectSort:= new(SelectSort)selectSort.Data = dataTimeTools(selectSort,"选择排序",20)}
时间复杂度分析
O(n^2)
通过实际测试可以看到,随着排序数据的增加,其算法执行时间是呈平方倍增加,即如果样本从100到1000再到1000,可以看到执行时间分别会增加100倍,10的平方。
算法:selectSort 数据量:100 执行时间为0.0009453296661376953算法:selectSort 数据量:1000 执行时间为0.06486988067626953算法:selectSort 数据量:10000 执行时间为5.670239448547363
