快速排序
當遞迴終止時,結束乙個waitgroup,遞迴開始時,加入乙個waitgroup直到所有排序操作結束,waitgroup空
快排流程
import (
"fmt"
"sync"
)var wg sync.waitgroup
func quicksort(a int, l, h int)
i, j, k := l + 1, h , a[l]
for true
for j >= l && a[j] > k
if i >= j
t := a[i]
a[i] = a[j]
a[j] = t
}t := a[l]
a[l] = a[j]
a[j] = t
wg.add(2)
go quicksort(a, l, j -1)
go quicksort(a, j + 1, h)
wg.done()
}
歸併排序
當遞迴終止時,結束傳入的waitgroup,遞迴前建立乙個waitgroup,然後加入兩個操作,waitgroup空後,進行歸併,呼叫歸併排序時建立的waitgroup完成時,排序完成
package main
import (
"fmt"
"sync"
)type comparable inte***ce ) bool
greater(b inte***ce{}) bool
}type integer int // comparable
func (a integer) less(b inte***ce{}) bool
func (a integer) greater(b inte***ce{}) bool
type double float64 // comparable
func (a double) less(b inte***ce{}) bool
func (a double) greater(b inte***ce{}) bool
type string string // comparable
func (a string) less(b inte***ce{}) bool
func (a string) greater(b inte***ce{}) bool
/*請按照comparable介面要求,實現類似上述三種型別的可比較型別*/
func merge(s, t comparable, l, m, r int) else
} for i != m + 1
for j != r + 1
for i=l;i<=r;i++
}/*請按照comparable介面要求,實現類似上述三種型別的可比較型別*/
func mergesort(s, t comparable, l, r int, w *sync.waitgroup)
w.done()
}func main()
t := make(comparable, 8)
var wg *sync.waitgroup = new(sync.waitgroup)
wg.add(1)
go mergesort(a,t,0,7, wg)
wg.wait()
fmt.println(a)
}
Golang 歸併排序 MergeSort
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2 路歸併。演算法描述 def mergesor...
快速排序 歸併排序
感覺好久之前不寫這些基礎的東西忽然覺著,想複習一下,就簡單溫習一下排序的例子 package com.ruishenh.algoritmic public class sort static void printmsg int arrs system.out.println static int g...
快速排序,歸併排序
快速排序 quicksort 是對 氣泡排序的一種改進。設要排序的 陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。需要注意的是,多個相同的值的相對位置也許會在演算法結束時產...