1
0
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:
Conrad Pankoff 2016-04-30 15:22:05 +10:00
commit 4c50a9dc04
2 changed files with 20 additions and 9 deletions

View File

@ -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)
})

View File

@ -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)
}
}