這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
go實現的部分排序演算法,待整理
// algorithm project main.gopackage mainimport ( "fmt")func main() { arr := []int{50, 45, 42, 30, 25, 20, 20, 5, 60, 3, 23, 50, 29, 235, 9} //arr := []int{50, 235, 60} fmt.Println(arr) fmt.Println("----------") //直接插入排序 //arr1 := insertSort(arr) //arr1 := selectSort(arr) //a, b := selectMinAndMax(arr, 0, 14) //arr1 := selectSortPlus(arr) quickSort(arr, 0, len(arr)-1) fmt.Println(arr)}/******** 冒泡排序begin ********/func bubbleSort(arr []int) []int { length := len(arr) for j := length - 1; j > 0; j-- { for i := 0; i < j; i++ { if arr[i] > arr[i+1] { exchange(arr, i, i+1) fmt.Println(arr) } } fmt.Println("++++++++++") } return arr}/******** 冒泡排序end ********//******* 直接插入排序begin ********///注意第一次排序應該是把第一位,即索引為0的看做一個有序序列了func insertSort(arr []int) []int { //擷取當前數組長度 length := len(arr) for i := 1; i < length; i++ { //當前值 now := arr[i] //如果當前哨兵小於之前序列中的某一個k的值,則序列從k向後整體移動一位 for j := i - 1; j >= 0; j-- { if now < arr[j] { arr[j+1] = arr[j] arr[j] = now } else { arr[j+1] = now break } } fmt.Println(arr) } return arr}/******* 直接插入排序end ********//******* 選擇排序-簡單選擇排序begin ********///選出最小的key值/*@param arr 待排序數組@param i從第i個元素擷取最小值*/func selectMin(arr []int, i int) int { length := len(arr) minKey := i minValue := arr[minKey] //從下標為i及之後的元素中找出值最小的元素 for k := minKey + 1; k < length; k++ { if minValue > arr[k] { //如果當前值大於之後某一元素,說明不是最小值,和之後元素交換 minKey = k minValue = arr[k] } } return minKey}func exchange(arr []int, a int, b int) { temp := arr[a] arr[a] = arr[b] arr[b] = temp}//開始進行選擇排序func selectSort(arr []int) []int { length := len(arr) for i := 0; i < length; i++ { //每迴圈一次都找出當前未排序元素中的最小值,和當前元素進行交換 minKey := selectMin(arr, i) exchange(arr, i, minKey) fmt.Println(i, arr) } return arr}/******* 選擇排序-簡單選擇排序end ********//******** 選擇排序的改進,二元選擇排序begin ********/func selectMinAndMax(arr []int, i int, j int) (int, int) { //length := len(arr) minKey := i minValue := arr[minKey] maxKey := j maxValue := arr[maxKey] //從下標為i及之後的元素中找出值最小的元素 for k := minKey + 1; k < j; k++ { if minValue > arr[k] { //如果當前值大於之後某一元素,說明不是最小值,和之後元素交換 minKey = k minValue = arr[k] } if maxValue < arr[k] { maxKey = k maxValue = arr[k] } } return minKey, maxKey}func selectSortPlus(arr []int) []int { length := len(arr) // for i := 0; i <= length/2; i++ { //一次迴圈,找出最大和最小值,分別替換最大端和最小端頂頭部分 minKey, maxKey := selectMinAndMax(arr, i, length-1-i) exchange(arr, i, minKey) exchange(arr, length-1-i, maxKey) fmt.Println(minKey, maxKey) } return arr}/******** 選擇排序的改進,二元選擇排序end ********//******** 快速排序begin ********/func quickSort(arr []int, left int, right int) { fmt.Println(left, right) //設定基準數,選擇第一個作為基準數 baseKey := left baseValue := arr[baseKey] i := left j := right for i < j { fmt.Println(i, j) //先從右向左找,直到找到一個小於基準數的值 for (arr[j] >= baseValue) && (i < j) { j-- } if i < j { //將j的值放到i的空位上 arr[i] = arr[j] } //從左向右找,直到找到一個大於基準數的值 for (i < j) && (arr[i] < baseValue) { i++ } if i < j { //將此時的i放到之前j產生的空位上 arr[j] = arr[i] } fmt.Println(i, j) } arr[i] = baseValue fmt.Println(arr) if left < i-1 { quickSort(arr, left, i-1) } if i+1 < right { quickSort(arr, i+1, right) }}/******** 快速排序end ********/