假设从小到大排序
1.选择排序
基本原理:
对于给定的一组记录,经过第一轮比较后得到最小记录,然后将该记录与第一个记录的位置交换;接着对不包括第一个记录以外的其他记录进行第二次比较,得到的最小记录与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个时为止。以数组{2,4,3,1,7,9,5,6}为例:
第一轮排序后:1{2,4,3,7,9,5,6}
第二轮排序后:1,2{4,3,7,9,5,6}
第三轮排序后:1,2,3{4,7,9,5,6}
第四轮排序后:1,2,3,4{7,9,5,6}
…
最后排序结果:{1,2,3,4,5,6,7,9}
代码如下:
package main
import "fmt"
func main() {
var arr = []int{2, 4, 3, 1, 7, 9, 5, 6}
selectionSort(arr)
fmt.Println(arr)
}
func selectionSort(arr []int) {
var minValue,minIndex int
for i := 0; i < len(arr); i++ {
minIndex=i
minValue = arr[i]
for j := i + 1; j < len(arr); j++ {
if arr[j] < minValue {
minValue = arr[j]
minIndex=j
if minIndex!=i {
arr[minIndex]=arr[i]
arr[i]=minValue
}
}
}
}
}
程序运行结果为:
[1 2 3 4 5 6 7 9]
2.插入排序
思路:
对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余的记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直到最后一个记录插入到有序序列中为止。以数组{2,4,3,1,7,9,5,6}为例:
第一步插入2后:2{4,3,1,7,9,5,6}
第二步插入4后:2,4{3,1,7,9,5,6}
第三步插入3后:2,3,4{1,7,9,5,6}
第四步插入1后:1,2,3,4{7,9,5,6}
第五步插入7后:1,2,3,4,7{9,5,6}
第六步插入9后:1,2,3,4,7,9{5,6}
第七步插入5后:1,2,3,4,5,7,9{6}
第八步插入6后:1,2,3,4,5,6,7,9
代码如下:
package main
import "fmt"
func main() {
var arr = []int{2, 4, 3, 1, 7, 9, 5, 6}
insertSort(arr)
fmt.Println(arr)
}
func insertSort(arr []int){
if arr ==nil{
return
}
var j,temp int
for i:=1;i<len(arr);i++{
if arr[i-1]>arr[i]{
temp=arr[i]
j=i-1
for ;j>=0&&arr[j]>temp;j--{
arr[j+1]=arr[j]
}
arr[j+1]=temp
}
}
}
程序运行结果为:
[1 2 3 4 5 6 7 9]
3.冒泡排序
思路:
对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换其位置,进行一轮比较和换位后,n个记录中最大记录将位于第n位;然后对前(n-1)个记录进行第二轮比较;重复该过程,直到进行比较的记录只剩下一个时为止,整个过程就像气泡一样上升。以数组{2,4,3,1,7,9,5,6}为例:
第一轮排序后:{2,4,3,1,7,5,6} 9
第二轮排序后:{2,4,3,1,5,6} 9,7
第三轮排序后:{2,4,3,1,5} 9,7,6
第四轮排序后:{2,4,3,1} 9,7,6,5
…
最后排序结果:{1,2,3,4,5,6,7,9}
代码如下:
package main
import "fmt"
func main() {
var arr = []int{2, 4, 3, 1, 7, 9, 5, 6}
bubbleSort(arr)
fmt.Println(arr)
}
func bubbleSort(arr []int){
var temp int
for i:=0;i<len(arr)-1;i++{
for j:=len(arr)-1;j>i;j--{
if arr[j]<arr[j-1]{
temp=arr[j]
arr[j]=arr[j-1]
arr[j-1]=temp
}
}
}
}
程序运行结果为:
[1 2 3 4 5 6 7 9]
4.快速排序
快速排序是一种非常高效的排序方法,它采用分而治之的方法,把大的拆分为小的,小的再拆分为更小的。
思路:
对于一组给定的记录,通过一轮排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。
代码如下: