冒泡排序、选择排序、插入排序、快速排序基于golang的实现
一、冒泡排序
算法原理:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码:
/**
*传入一个切片,对切片中的数字进行排序交换
*/
func Bubblesort([] int arr)([] int result){
for i:=0;i<len(arr);i++{
for j:=0;j<len(arr)-i-1;j++{
//比较两个数
if arr[j]<arr[j+1]{
//对两个数进行交换
arr[j],arr[j+1]=arr[j+1],arr[j]
}
}
}
return
}
二、选择排序
算法原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
核心代码:
func Selectsort(arr[]int)(result[] int){
len:=len(arr)
for i:=0;i<len;i++{
minIndex:=i
for j:=i+1;j<len;j++{
if arr[minIndex]>arr[j]{
minIndex=j
}
}
if minIndex!=i{
arr[minIndex],arr[i]=arr[i],arr[minIndex]
}
}
result=arr
return
}
代码运行展示:
三 插入排序
算法原理:从第二个数开始向右侧遍历,每次均把该位置的元素移动至左侧,放在放在一个正确的位置(比左侧大,比右侧小)。
核心代码:
func Insertsort(arr []int) (result [] int){
len:=len(arr)
for i:=0;i<len;i++{
for j:=i;j>0;j--{
if a[j]>a[j-1]{
break
}
//交换元素
a[j],a[j-1]=a[j-1],a[j]
}
}
result=arr
return
}
代码运行展示
四、快速排序
算法原理:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
核心代码:
func Quiscksort(arr []int,left int,right int) {
if left>=right{
return
}
val:=arr[left]
k:=left
//遍历剩余的数,确保所有的值左边的数比val大,右边的数比val小
for i:=left+1;i<=right;i++{
if arr[i]<val{
arr[k]=arr[i]
arr[i]=arr[k+1]
k++
}
}
arr[k]=val
Quiscksort(arr,left,k-1)
Quiscksort(arr,k+1,right)
}
调用:
var arr=[]int{3,2,12,1,6,3,34,15}
Quiscksort(arr,0,len(arr)-1)
fmt.Println("排序结果:",arr)
运行展示: