基本排序算法(Golang)
发布时间:2020-12-16 18:48:22 所属栏目:大数据 来源:网络整理
导读:冒泡排序 funcBubbleSort(vector[]int){fmt.Println("BubbleSort")fmt.Println(vector)fori:=0;ilen(vector);i++{tag:=true//为了剪枝//每一趟将最大的数冒泡forj:=0;jlen(vector)-i-1;j++{ifvector[j]vector[j+1]{/*vector[j]vector[j+1]*/temp:=vector[j]v
冒泡排序 funcBubbleSort(vector[]int){ fmt.Println("BubbleSort") fmt.Println(vector) fori:=0;i<len(vector);i++{ tag:=true//为了剪枝 //每一趟将最大的数冒泡 forj:=0;j<len(vector)-i-1;j++{ ifvector[j]>vector[j+1]{/*vector[j]<vector[j+1]*/ temp:=vector[j] vector[j]=vector[j+1] vector[j+1]=temp tag=false } } iftag{ break//0~len(vector)-i没有发生交换说明已经有序 } fmt.Println(vector) } } 插入排序 funcInsertSort(vector[]int){ fmt.Println("InsertSort") fmt.Println(vector) fori:=1;i<len(vector);i++{ //每一趟不满足条件就选择i为哨兵保存,将哨兵插入0~i-1有序序列(0~i-1始终是有序的) ifvector[i]<vector[i-1]{/*vector[i]>vector[i-1]*/ temp:=vector[i] //后移直到找到哨兵合适的位置 j:=i-1 for;j>=0&&vector[j]>temp;j--{/*vector[j]<temp*/ vector[j+1]=vector[j] } //插入位置前后都是有序的,最后也是有序的 vector[j+1]=temp } fmt.Println(vector) } } 选择排序 funcSelectSort(vector[]int){ fmt.Println("SelectSort") fmt.Println(vector) fori:=0;i<len(vector);i++{ //选择最小的元素 k:=i forj:=i+1;j<len(vector);j++{ ifvector[k]>vector[j]{ k=j } } //交换 ifk!=i{ temp:=vector[i] vector[i]=vector[k] vector[k]=temp } fmt.Println(vector) } } 二元选择排序 funcBinarySelectSort(vector[]int){ fmt.Println("SelectSort") fmt.Println(vector) n:=len(vector) fori:=0;i<n/2;i++{ //选择最小的元素和最大元素 k:=i t:=n-i-1 forj:=i+1;j<=n-i-1;j++{ ifvector[k]>vector[j]{ k=j } ifvector[t]<vector[j]{ t=j } } //交换 ifk!=i{ temp:=vector[i] vector[i]=vector[k] vector[k]=temp } ift!=n-i-1{ temp:=vector[n-i-1] vector[n-i-1]=vector[t] vector[t]=temp } fmt.Println(vector) } } 快速排序 简单的说快速排序就是挖坑填数然后分治,公认效率最好,这个必须会 funcQuickSort(vector[]int,low,hightint){ fmt.Println(vector) iflow<hight{ i:=low j:=hight temp:=vector[low]//开始挖坑填数 fori<j{ fori<j&&vector[j]>=temp{ j-- } vector[i]=vector[j] fori<j&&vector[i]<=temp{ i++ } vector[j]=vector[i] } vector[i]=temp QuickSort(vector,i-1)//分治 QuickSort(vector,i+1,hight) } } 常见问题,已知序列WAUSTHKO,将第一个数作W为基数,问: 1,第一趟后的序列是多少?假设递归同时进行 1),OAUSTHKW 2),KAHOTSUW 3),HAKOSTUW 4),AHKOSTUW 2,排序过程中那些数会被作为选基数? 以上标记的都是:W,O,K、T,H 3,基数的选择直接影响到效率,同时排序末尾显然有效率问题,可以用其他算法替换。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |