选择排序的初始方法与优化后的方法-js与golang写法
选择排序是每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。
实际上,我们可以一趟选出两个值,一个最大值一个最小值,然后将其放在序列开头和末尾,这样可以使选择排序的效率快一倍。
时间复杂度:最坏情况:O(N^2) 最好情况:O(N^2)
空间复杂度:O(1)
我们来看看图解:
js的代码与打印结果是:
var ints = [8,6,2,5,132,748,541,231,463,21,4,7,8,6214,123] console.log(ints,"最初的数组") var min=temp=0 num=0 for(var i=0;i<ints.length;i++){ for(var j=i+1;j<ints.length;j++){ num++ //取出最小值 if(ints[j]<ints[min])min=j } temp=ints[i] ints[i]=ints[min] ints[min]=temp console.log(ints,"最小值是",ints[i]) } console.log("总共的排序次数是",num) --------------------------------- > Array [8, 6, 2, 5, 132, 748, 541, 231, 463, 21, 4, 7, 8, 6214, 123] "最初的数组" > Array [2, 6, 8, 5, 132, 748, 541, 231, 463, 21, 4, 7, 8, 6214, 123] "最小值是" 2 > Array [2, 4, 8, 5, 132, 748, 541, 231, 463, 21, 6, 7, 8, 6214, 123] "最小值是" 4 > Array [2, 4, 5, 8, 132, 748, 541, 231, 463, 21, 6, 7, 8, 6214, 123] "最小值是" 5 > Array [2, 4, 5, 6, 132, 748, 541, 231, 463, 21, 8, 7, 8, 6214, 123] "最小值是" 6 > Array [2, 4, 5, 6, 7, 748, 541, 231, 463, 21, 8, 132, 8, 6214, 123] "最小值是" 7 > Array [2, 4, 5, 6, 7, 8, 541, 231, 463, 21, 748, 132, 8, 6214, 123] "最小值是" 8 > Array [2, 4, 5, 6, 7, 8, 8, 231, 463, 21, 748, 132, 541, 6214, 123] "最小值是" 8 > Array [2, 4, 5, 6, 7, 8, 8, 21, 463, 231, 748, 132, 541, 6214, 123] "最小值是" 21 > Array [2, 4, 5, 6, 7, 8, 8, 21, 123, 231, 748, 132, 541, 6214, 463] "最小值是" 123 > Array [2, 4, 5, 6, 7, 8, 8, 21, 123, 132, 748, 231, 541, 6214, 463] "最小值是" 132 > Array [2, 4, 5, 6, 7, 8, 8, 21, 123, 132, 231, 748, 541, 6214, 463] "最小值是" 231 > Array [2, 4, 5, 6, 7, 8, 8, 21, 123, 132, 231, 463, 541, 6214, 748] "最小值是" 463 > Array [2, 4, 5, 6, 7, 8, 8, 21, 123, 132, 231, 463, 748, 6214, 541] "最小值是" 748 > Array [2, 4, 5, 6, 7, 8, 8, 21, 123, 132, 231, 463, 748, 541, 6214] "最小值是" 541 > Array [2, 4, 5, 6, 7, 8, 8, 21, 123, 132, 231, 463, 748, 541, 6214] "最小值是" 6214 > "总共的排序次数是" 105
用golang优化过后的方法,每次都会去找到最小值与最大值
package main import "fmt" func main() { ints :=[]int{8,6,2,5,132,748,541,231,463,21,4,7,8,6214,123} fmt.Printf("%+v==>初始的数据\n",ints) num,min,max,length :=0,0,0,len(ints) for i:=0;i<length/2;i++{ //循环的长度/2 for j:=i+1;j<length-i;j++{ num++ if ints[j]<ints[min]{ min=j } if ints[j]>ints[max]{ max=j } } ints[min],ints[i]=ints[i],ints[min] ints[max],ints[length-i-1]=ints[length-i-1],ints[max] fmt.Printf("%+v=本文来自投稿,不代表本人立场,如若转载,请注明出处;如有问题您可以发邮件到:itlun@qq.com