1.冒泡排序
package main import ( "fmt" "math/rand" "time" ) func bubble_sort(arr []int){ var flag bool for i:=0;i<len(arr)-1;i++{ flag = true for j:=0;j<len(arr)-1-i;j++{ if arr[j] > arr[j+1]{ arr[j],arr[j+1] = arr[j+1],arr[j] flag = false } } if flag{ break } } } func main(){ arr := make([]int, 10) rand.Seed(time.Now().UnixNano()) for i:=0;i<len(arr);i++{ arr[i] = rand.Intn(100) } fmt.Println("排序前", arr) bubble_sort(arr) fmt.Println("排序后", arr) }
2.选择排序
package main import ( "fmt" "math/rand" "time" ) func select_sort(arr []int){ //先假设第一个元素为最小,让后面的元素和第一个进行比较,如果大了就进行交换 //然后假设第二个元素为第二小,依次类推 for i:=0;i<len(arr)-1;i++{ for j:=i+1;j<len(arr);j++{ if arr[j] < arr[i]{ arr[i],arr[j] = arr[j],arr[i] } } } } func main(){ arr := make([]int, 10) rand.Seed(time.Now().UnixNano()) for i:=0;i<len(arr);i++{ arr[i] = rand.Intn(100) } fmt.Println("排序前", arr) select_sort(arr) fmt.Println("排序后", arr) }
3.插入排序
package main import ( "fmt" "math/rand" "time" ) func insert_sort(arr []int){ for i:=1;i<len(arr);i++{ j := i - 1 for j>=0 && arr[j]>arr[j+1]{ arr[j],arr[j+1] = arr[j+1],arr[j] j -= 1 } } } func main(){ arr := make([]int, 10) rand.Seed(time.Now().UnixNano()) for i:=0;i<len(arr);i++{ arr[i] = rand.Intn(100) } fmt.Println("排序前", arr) insert_sort(arr) fmt.Println("排序后", arr) }
4.选择排序
package main import ( "fmt" "math/rand" "time" ) /* 快速排序原理: 先选择一个数,进行排序,使得左边的数比它小,右边的数比它大 如何实现:想象两个指针,一个从左往右走,另一个从右往左走 先从最右边开始走,如果大的话就继续向左走,当比选择的数小的话,就让右指针等于左指针此时所指的数,此时两个数一样 然后从左往右开始走,如果小的话就继续往右走,当比选择的数大的话,就让左指针等于右指针此时所指的数,此时两个数右一样,但是之前相等的数字换回来了 然后再从右边开始找,满足条件继续交换,然后从左边开始找 直到使得左边的数比选择的数字小,右边比选择的数字大,但是这样肯定会多出来一个重复的指,所以最后再交换回来。 然后以选择的数字为基准,相当于左右又分成了两个数组。看到这,应该想到了,使用递归,不断分割,直至无法分割的时候,那么数组的顺序便排好了。 */ func partition(arr []int, left, right int)int{ //我们选择数字就从左往右选择,先找个变量把值存起来 tmp := arr[left] for left < right{ //先从右指针开始,当left小于right并且右边的数字比选择的数字大的时候,继续往左走 for left < right && arr[right] > tmp{ right -= 1 } //如果右边的数字比选择的数字小,那么就让左指针指的数等于右指针所指的数 arr[left] = arr[right] //然后轮到左指针,当left小于right并且左边的数字比选择的数字小的时候,继续右左走 for left < right && arr[left] < tmp{ left += 1 } //如果左边的数字比选择的数字大,那么就让右指针指的数等于左指针指的数 arr[right] = arr[left] } //以上不断循环,便会交换完毕,但是会多出来一个重复的指,所以再交换回去 arr[left] = tmp return left } func quick_sort(arr []int,left,right int){ if left < right{ mid := partition(arr, left, right) //找到了mid,也就是那个最终选择的数字的索引,然后递归 quick_sort(arr, left, mid-1) quick_sort(arr, mid+1, right) } } func main(){ arr := make([]int, 10) rand.Seed(time.Now().UnixNano()) for i:=0;i<len(arr);i++{ arr[i] = rand.Intn(100) } fmt.Println("排序前", arr) quick_sort(arr, 0 , len(arr)-1) fmt.Println("排序后", arr) }