mirror of
https://github.com/robertkrimen/otto
synced 2025-10-12 20:27:30 +08:00
Merge pull request #173 from xl1/improve-array-sort
Improve performance to sort array with the same values
This commit is contained in:
commit
4c50a9dc04
|
@ -321,9 +321,11 @@ func TestArray_sort(t *testing.T) {
|
|||
stu = [1,5,-10, 100, 8, 72, 401, 0.05].sort(function(x, y){
|
||||
return x == y ? 0 : x < y ? -1 : 1
|
||||
});
|
||||
vwx = [1,2,3,1,2,3].sort();
|
||||
yza = [1,2,3,1,0,1,-1,0].sort();
|
||||
|
||||
[ abc, def, ghi, jkl, mno, pqr, stu ].join(";");
|
||||
`, "0,1,2,3;0,1,2,3;;0;0,1;-10,0.05,1,100,401,5,72,8;-10,0.05,1,5,8,72,100,401")
|
||||
[ abc, def, ghi, jkl, mno, pqr, stu, vwx, yza ].join(";");
|
||||
`, "0,1,2,3;0,1,2,3;;0;0,1;-10,0.05,1,100,401,5,72,8;-10,0.05,1,5,8,72,100,401;1,1,2,2,3,3;-1,0,0,1,1,1,2,3")
|
||||
|
||||
test(`Array.prototype.sort.length`, 1)
|
||||
})
|
||||
|
|
|
@ -416,27 +416,36 @@ func arraySortSwap(thisObject *_object, index0, index1 uint) {
|
|||
}
|
||||
}
|
||||
|
||||
func arraySortQuickPartition(thisObject *_object, left, right, pivot uint, compare *_object) uint {
|
||||
func arraySortQuickPartition(thisObject *_object, left, right, pivot uint, compare *_object) (uint, uint) {
|
||||
arraySortSwap(thisObject, pivot, right) // Right is now the pivot value
|
||||
cursor := left
|
||||
cursor2 := left
|
||||
for index := left; index < right; index++ {
|
||||
if sortCompare(thisObject, index, right, compare) < 0 { // Compare to the pivot value
|
||||
comparison := sortCompare(thisObject, index, right, compare) // Compare to the pivot value
|
||||
if comparison < 0 {
|
||||
arraySortSwap(thisObject, index, cursor)
|
||||
if cursor < cursor2 {
|
||||
arraySortSwap(thisObject, index, cursor2)
|
||||
}
|
||||
cursor += 1
|
||||
cursor2 += 1
|
||||
} else if comparison == 0 {
|
||||
arraySortSwap(thisObject, index, cursor2)
|
||||
cursor2 += 1
|
||||
}
|
||||
}
|
||||
arraySortSwap(thisObject, cursor, right)
|
||||
return cursor
|
||||
arraySortSwap(thisObject, cursor2, right)
|
||||
return cursor, cursor2
|
||||
}
|
||||
|
||||
func arraySortQuickSort(thisObject *_object, left, right uint, compare *_object) {
|
||||
if left < right {
|
||||
pivot := left + (right-left)/2
|
||||
pivot = arraySortQuickPartition(thisObject, left, right, pivot, compare)
|
||||
middle := left + (right-left)/2
|
||||
pivot, pivot2 := arraySortQuickPartition(thisObject, left, right, middle, compare)
|
||||
if pivot > 0 {
|
||||
arraySortQuickSort(thisObject, left, pivot-1, compare)
|
||||
}
|
||||
arraySortQuickSort(thisObject, pivot+1, right, compare)
|
||||
arraySortQuickSort(thisObject, pivot2+1, right, compare)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user