Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
be1ef8a9
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
be1ef8a9
编写于
7月 06, 2018
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
debt - less array creation in stable sort
上级
e16b8f96
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
40 addition
and
27 deletion
+40
-27
src/vs/base/common/arrays.ts
src/vs/base/common/arrays.ts
+35
-27
src/vs/base/test/common/arrays.test.ts
src/vs/base/test/common/arrays.test.ts
+5
-0
未找到文件。
src/vs/base/common/arrays.ts
浏览文件 @
be1ef8a9
...
...
@@ -77,48 +77,56 @@ export function findFirstInSorted<T>(array: T[], p: (x: T) => boolean): number {
return
low
;
}
type
Compare
<
T
>
=
(
a
:
T
,
b
:
T
)
=>
number
;
/**
* Like `Array#sort` but always stable. Usually runs a little slower `than Array#sort`
* so only use this when actually needing stable sort.
*/
export
function
mergeSort
<
T
>
(
data
:
T
[],
compare
:
(
a
:
T
,
b
:
T
)
=>
number
):
T
[]
{
_
divideAndMerge
(
data
,
compare
);
export
function
mergeSort
<
T
>
(
data
:
T
[],
compare
:
Compare
<
T
>
):
T
[]
{
_
sort
(
data
,
compare
,
0
,
data
.
length
-
1
,
[]
);
return
data
;
}
function
_
divideAndMerge
<
T
>
(
data
:
T
[],
compare
:
(
a
:
T
,
b
:
T
)
=>
number
):
void
{
if
(
data
.
length
<=
1
)
{
// sorted
return
;
function
_
merge
<
T
>
(
a
:
T
[],
compare
:
Compare
<
T
>
,
lo
:
number
,
mid
:
number
,
hi
:
number
,
aux
:
T
[]
):
void
{
let
leftIdx
=
lo
,
rightIdx
=
mid
+
1
;
for
(
let
i
=
lo
;
i
<=
hi
;
i
++
)
{
aux
[
i
]
=
a
[
i
]
;
}
const
p
=
(
data
.
length
/
2
)
|
0
;
const
left
=
data
.
slice
(
0
,
p
);
const
right
=
data
.
slice
(
p
);
_divideAndMerge
(
left
,
compare
);
_divideAndMerge
(
right
,
compare
);
let
leftIdx
=
0
;
let
rightIdx
=
0
;
let
i
=
0
;
while
(
leftIdx
<
left
.
length
&&
rightIdx
<
right
.
length
)
{
let
ret
=
compare
(
left
[
leftIdx
],
right
[
rightIdx
]);
if
(
ret
<=
0
)
{
// smaller_equal -> take left to preserve order
data
[
i
++
]
=
left
[
leftIdx
++
];
for
(
let
i
=
lo
;
i
<=
hi
;
i
++
)
{
if
(
leftIdx
>
mid
)
{
// left side consumed
a
[
i
]
=
aux
[
rightIdx
++
];
}
else
if
(
rightIdx
>
hi
)
{
// right side consumed
a
[
i
]
=
aux
[
leftIdx
++
];
}
else
if
(
compare
(
aux
[
rightIdx
],
aux
[
leftIdx
])
<
0
)
{
// right element is less -> comes first
a
[
i
]
=
aux
[
rightIdx
++
];
}
else
{
//
greater -> take right
data
[
i
++
]
=
right
[
righ
tIdx
++
];
//
left element comes first (less or equal)
a
[
i
]
=
aux
[
lef
tIdx
++
];
}
}
while
(
leftIdx
<
left
.
length
)
{
data
[
i
++
]
=
left
[
leftIdx
++
];
}
function
_sort
<
T
>
(
a
:
T
[],
compare
:
Compare
<
T
>
,
lo
:
number
,
hi
:
number
,
aux
:
T
[])
{
if
(
hi
<=
lo
)
{
return
;
}
while
(
rightIdx
<
right
.
length
)
{
data
[
i
++
]
=
right
[
rightIdx
++
];
let
mid
=
lo
+
((
hi
-
lo
)
/
2
)
|
0
;
_sort
(
a
,
compare
,
lo
,
mid
,
aux
);
_sort
(
a
,
compare
,
mid
+
1
,
hi
,
aux
);
if
(
compare
(
a
[
mid
],
a
[
mid
+
1
])
<=
0
)
{
// left and right are sorted and if the last-left element is less
// or equals than the first-right element there is nothing else
// to do
return
;
}
_merge
(
a
,
compare
,
lo
,
mid
,
hi
,
aux
);
}
export
function
groupBy
<
T
>
(
data
:
T
[],
compare
:
(
a
:
T
,
b
:
T
)
=>
number
):
T
[][]
{
const
result
:
T
[][]
=
[];
let
currentGroup
:
T
[];
...
...
src/vs/base/test/common/arrays.test.ts
浏览文件 @
be1ef8a9
...
...
@@ -52,6 +52,11 @@ suite('Arrays', () => {
assert
.
deepEqual
(
data
,
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
]);
});
test
(
'
mergeSort, sorted array
'
,
function
()
{
let
data
=
arrays
.
mergeSort
([
1
,
2
,
3
,
4
,
5
,
6
],
(
a
,
b
)
=>
a
-
b
);
assert
.
deepEqual
(
data
,
[
1
,
2
,
3
,
4
,
5
,
6
]);
});
test
(
'
mergeSort, is stable
'
,
function
()
{
let
numbers
=
arrays
.
mergeSort
([
33
,
22
,
11
,
4
,
99
,
1
],
(
a
,
b
)
=>
0
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录