mirror of https://github.com/emirpasic/gods
- starting work on sorting functions using tim's sort obtained from [https://github.com/psilva261/timsort]
parent
f18fd78d3c
commit
19ca842c34
@ -0,0 +1,37 @@
|
||||
/*
|
||||
Copyright (c) 2015, Emir Pasic
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
// Util methods for sorting a slice of values with respect to the comparator
|
||||
|
||||
package utils
|
||||
|
||||
import "github.com/emirpasic/gods/utils/timsort"
|
||||
|
||||
// Sorts values (in-place)
|
||||
func Sort(values []interface{}, comparator Comparator) {
|
||||
less := func(a, b interface{}) bool { return comparator(a, b) < 0 }
|
||||
timsort.Sort(values, less)
|
||||
}
|
@ -0,0 +1,102 @@
|
||||
/*
|
||||
Copyright (c) 2015, Emir Pasic
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
package utils
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSortInts(t *testing.T) {
|
||||
ints := []interface{}{}
|
||||
ints = append(ints, 4)
|
||||
ints = append(ints, 1)
|
||||
ints = append(ints, 2)
|
||||
ints = append(ints, 3)
|
||||
|
||||
Sort(ints, IntComparator)
|
||||
|
||||
for i := 1; i < len(ints); i++ {
|
||||
if ints[i-1].(int) > ints[i].(int) {
|
||||
t.Errorf("Not sorted!")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestSortStrings(t *testing.T) {
|
||||
|
||||
strings := []interface{}{}
|
||||
strings = append(strings, "d")
|
||||
strings = append(strings, "a")
|
||||
strings = append(strings, "b")
|
||||
strings = append(strings, "c")
|
||||
|
||||
Sort(strings, StringComparator)
|
||||
|
||||
for i := 1; i < len(strings); i++ {
|
||||
if strings[i-1].(string) > strings[i].(string) {
|
||||
t.Errorf("Not sorted!")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSortStructs(t *testing.T) {
|
||||
type User struct {
|
||||
id int
|
||||
name string
|
||||
}
|
||||
|
||||
byID := func(a, b interface{}) int {
|
||||
c1 := a.(User)
|
||||
c2 := b.(User)
|
||||
switch {
|
||||
case c1.id > c2.id:
|
||||
return 1
|
||||
case c1.id < c2.id:
|
||||
return -1
|
||||
default:
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
// o1,o2,expected
|
||||
users := []interface{}{
|
||||
User{4, "d"},
|
||||
User{1, "a"},
|
||||
User{3, "c"},
|
||||
User{2, "b"},
|
||||
}
|
||||
|
||||
Sort(users, byID)
|
||||
|
||||
for i := 1; i < len(users); i++ {
|
||||
if users[i-1].(User).id > users[i].(User).id {
|
||||
t.Errorf("Not sorted!")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
Copyright (c) 2010-2011 Mike Kroutikov
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue