快速排序首先選一個基準(你也能夠認爲是要放到排序後數組正確位置的元素)pivot,而後將數組按照選取的基準 pivot 進行劃分。而選取 pivot 的方式又有不少種,因此快速排序具備不少版本。數組
老是選擇第一個元素做爲基準 pivot;
老是選擇最後一個元素做爲基準;(本文後續的實現就是依次爲例)
隨機的選擇一個元素做爲基準;
選擇最中間的元素做爲基準;測試
快速排序的關鍵是劃分 partion() 。每一趟劃分,咱們就能夠將做爲 pivot 的值 x 放到排序數組的正確位置,而且將全部比 x 小的放到 x 的左邊,全部比 x 大的元素放到 x 的右邊。ui
package tools //劃分 func partition(arr *[]int,left int,right int)int{ privot:=(*arr)[right] i:=left-1 for j:=left;j<right;j++{ if (*arr)[j]<privot{ i++ temp:=(*arr)[i] (*arr)[i]=(*arr)[j] (*arr)[j]=temp } } temp:=(*arr)[i+1] (*arr)[i+1]=(*arr)[right] (*arr)[right]=temp return i+1 } //遞歸 func QuickSort(arr *[]int,left int,right int){ if left>= right{ return } privot:=partition(arr,left,right) QuickSort(arr,left,privot-1) QuickSort(arr,privot+1,right) }
測試用例:blog
package tools import ( "testing" ) func TestQuickSort(t *testing.T) { arr:=[]int{1,8,3,9,4,5,4,7} t.Log(arr) QuickSort(&arr,0,len(arr)-1) t.Log(arr) }
go test -v sorts_test.go sorts.go排序
文章轉載自公衆號(景寓)遞歸