Skip to content

Instantly share code, notes, and snippets.

@scbizu
Created February 9, 2017 17:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scbizu/4ef9e2e1eb64bd8e1054434c3031ff55 to your computer and use it in GitHub Desktop.
Save scbizu/4ef9e2e1eb64bd8e1054434c3031ff55 to your computer and use it in GitHub Desktop.
[QuickSort]QuickSort NlogN Golang implement
package sort
//SrcData ...
type SrcData struct {
Length int
Src []int
//Desc will sort Src by value Desc
Desc bool
}
//NewSrcData will init a SrcData object .
func NewSrcData(src []int) *SrcData {
srcdata := new(SrcData)
srcdata.Src = src
srcdata.Length = len(src)
//will defaultly be desc order
srcdata.Desc = true
return srcdata
}
//QuickSort ...
func (src *SrcData) QuickSort() {
// log.Println(src.Src)
prefix := 0
suffix := src.Length - 1
// log.Println(src.Length)
probe := src.Src[0]
for prefix != suffix {
//Order the data DESC
if src.Desc {
for suffix > prefix && src.Src[suffix] <= probe {
suffix--
}
for prefix < suffix && src.Src[prefix] >= probe {
prefix++
}
if prefix < suffix {
src.Src[suffix], src.Src[prefix] = src.Src[prefix], src.Src[suffix]
}
} else {
for suffix > prefix && src.Src[suffix] >= probe {
suffix--
}
for prefix < suffix && src.Src[prefix] <= probe {
prefix++
}
if prefix < suffix {
src.Src[suffix], src.Src[prefix] = src.Src[prefix], src.Src[suffix]
}
}
}
src.Src[prefix], src.Src[0] = probe, src.Src[prefix]
next1 := NewSrcData(src.Src[:prefix])
if next1.Length > 0 {
next1.QuickSort()
}
next2 := NewSrcData(src.Src[prefix+1 : src.Length])
if next2.Length > 0 {
next2.QuickSort()
}
}
package sort
import "testing"
func TestQuickSort(t *testing.T) {
data := NewSrcData([]int{3, 2, 1, 7, 4, 5})
data.QuickSort()
for _, value := range data.Src {
t.Log(value)
}
}
func BenchmarkQuickSort(b *testing.B) {
data := NewSrcData([]int{3, 2, 1, 7, 4, 5})
data.QuickSort()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment