1. 首页

选择排序的初始方法与优化后的方法-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