排序
排序是将一组数据,依指定的顺序进行排列的过程。
常见的排序:
1)冒泡排序
2)选择排序
3)插入排序
4)快速排序
选择排序
选择式排序也属于内部排序法,是从排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
func SelectSort(arr *[5]int){
//标准的访问方式
//arr[1]=600 //等价于(*arr)[1]=600
//1.先完成第一个最大值和arr[0] 交换
//假设arr[0]是最大值
for j :=0;j<len(arr)-1;j++{
max := arr[j]
maxIndex :=j
//遍历后面
for i := j+1;i<len(arr) ;i++{
if max < arr[i]{ //找到真正的最大值
max = arr[i]
maxIndex = i
}
}
//交换
if maxIndex !=j {
arr[j],arr[maxIndex] = arr[maxIndex],arr[j]
}
fmt.Printf("第%d次 %v \n",j+1,*arr)
}
}
func main(){
//定义一个数组,从大到小
arr := [5]int{10,34,55,1,22}
SelectSort(&arr)
fmt.Println(arr)
}
插入排序
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
func InsertSort(arr *[5]int){
for i := 1;i<len(arr);i++{
//完成第一次,给第二个元素找到合适的位置并插入
insertVal := arr[i]
insertIndex := i-1
//从大到小
for insertIndex >= 0 && arr[insertIndex] < insertVal{
arr[insertIndex+1]=arr[insertIndex] //数据后移
insertIndex--
}
//插入
if insertIndex +1 != i{
arr[insertIndex+1]= insertVal
}
fmt.Printf("第%d次插入后 %v \n",i,*arr)
}
}
func main(){
arr := [5]int{23,14,1,56,47}
InsertSort(&arr)
fmt.Println(arr)
}
快速排序法:
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
//left : 表示数组左边的下标
//right : 表示数组右边的下标
//array : 要排序的数组
func QuickSort(left int,right int,array *[6]int){
l := left
r := right
//pivot 是中轴,支点 --找到中间的数
pivot := array[(left+right)/2]
temp := 0
//循环的目标是将比pivot 小的数放到右边
//比pivot 大的数放到右边
for ; l<r ;{
//从pivot的左边找到大于等于pivot的值
for ;array[l]<pivot;{
l++
}
//从pivot的右边边找到小于等于pivot的值
for ;array[r]>pivot;{
r--
}
//本次分解任务完成,break
if l >= r {
break
}
//交换
temp = array[l]
array[l] = array[r]
array[r] = temp
//优化
if array[l] == pivot{
r--
}
if array[r] == pivot{
l++
}
}
// 在移动一位
if l ==r {
l++
r--
}
//向左递归
if left <r {
QuickSort(left,r,array)
}
//向右递归
if right >l {
QuickSort(l,right,array)
}
}
func main(){
arr := [6]int{-9,56,12,0,-112,49}
fmt.Println("初始数组:",arr)
QuickSort(0,len(arr)-1,&arr)
fmt.Println(arr)
}