mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-14 23:33:28 +00:00
add algorithm.merge (#16182)
* add merge to algorithm * Apply suggestions from code review * Update lib/pure/algorithm.nim * Apply suggestions from code review * Update changelog.md Co-authored-by: ee7 <45465154+ee7@users.noreply.github.com>
This commit is contained in:
@@ -4,7 +4,8 @@ discard """
|
||||
'''
|
||||
"""
|
||||
#12928,10456
|
||||
import std/[sequtils, algorithm, json]
|
||||
|
||||
import std/[sequtils, algorithm, json, sugar]
|
||||
|
||||
proc test() =
|
||||
try:
|
||||
@@ -114,3 +115,159 @@ block:
|
||||
doAssert binarySearch(moreData, 6) == -1
|
||||
doAssert binarySearch(moreData, 4711) == 4
|
||||
doAssert binarySearch(moreData, 4712) == -1
|
||||
|
||||
# merge
|
||||
proc main() =
|
||||
block:
|
||||
var x = @[1, 7, 8, 11, 21, 33, 45, 99]
|
||||
var y = @[6, 7, 9, 12, 57, 66]
|
||||
|
||||
var merged: seq[int]
|
||||
merged.merge(x, y)
|
||||
doAssert merged.isSorted
|
||||
doAssert merged == sorted(x & y)
|
||||
|
||||
block:
|
||||
var x = @[111, 88, 76, 56, 45, 31, 22, 19, 11, 3]
|
||||
var y = @[99, 85, 83, 82, 69, 64, 48, 42, 33, 31, 26, 13]
|
||||
|
||||
var merged: seq[int]
|
||||
merged.merge(x, y, (x, y) => -system.cmp(x, y))
|
||||
doAssert merged.isSorted((x, y) => -system.cmp(x, y))
|
||||
doAssert merged == sorted(x & y, SortOrder.Descending)
|
||||
|
||||
block:
|
||||
var x: seq[int] = @[]
|
||||
var y = @[1]
|
||||
|
||||
var merged: seq[int]
|
||||
merged.merge(x, y)
|
||||
doAssert merged.isSorted
|
||||
doAssert merged.isSorted(SortOrder.Descending)
|
||||
doAssert merged == @[1]
|
||||
|
||||
block:
|
||||
var x = [1, 3, 5, 5, 7]
|
||||
var y: seq[int] = @[]
|
||||
|
||||
var merged: seq[int]
|
||||
merged.merge(x, y)
|
||||
doAssert merged.isSorted
|
||||
doAssert merged == @x
|
||||
|
||||
block:
|
||||
var x = [1, 3, 5, 5, 7]
|
||||
var y: seq[int] = @[]
|
||||
|
||||
var merged: seq[int] = @[1, 2, 3, 5, 6, 56, 99, 2, 34]
|
||||
merged.merge(x, y)
|
||||
doAssert merged == @[1, 2, 3, 5, 6, 56, 99, 2, 34, 1, 3, 5, 5, 7]
|
||||
|
||||
|
||||
block:
|
||||
var x: array[0, int]
|
||||
var y = [1, 4, 6, 7, 9]
|
||||
|
||||
var merged: seq[int]
|
||||
merged.merge(x, y)
|
||||
doAssert merged.isSorted
|
||||
doAssert merged == @y
|
||||
|
||||
block:
|
||||
var x: array[0, int]
|
||||
var y: array[0, int]
|
||||
|
||||
var merged: seq[int]
|
||||
merged.merge(x, y)
|
||||
doAssert merged.isSorted
|
||||
doAssert merged.len == 0
|
||||
|
||||
block:
|
||||
var x: array[0, int]
|
||||
var y: array[0, int]
|
||||
|
||||
var merged: seq[int] = @[99, 99, 99]
|
||||
merged.setLen(0)
|
||||
merged.merge(x, y)
|
||||
doAssert merged.isSorted
|
||||
doAssert merged.len == 0
|
||||
|
||||
block:
|
||||
var x: seq[int]
|
||||
var y: seq[int]
|
||||
|
||||
var merged: seq[int]
|
||||
merged.merge(x, y)
|
||||
doAssert merged.isSorted
|
||||
doAssert merged.len == 0
|
||||
|
||||
block:
|
||||
type
|
||||
Record = object
|
||||
id: int
|
||||
|
||||
proc r(id: int): Record =
|
||||
Record(id: id)
|
||||
|
||||
proc cmp(x, y: Record): int =
|
||||
if x.id == y.id: return 0
|
||||
if x.id < y.id: return -1
|
||||
result = 1
|
||||
|
||||
var x = @[r(-12), r(1), r(3), r(8), r(13), r(88)]
|
||||
var y = @[r(4), r(7), r(12), r(13), r(77), r(99)]
|
||||
|
||||
var merged: seq[Record] = @[]
|
||||
merged.merge(x, y, cmp)
|
||||
doAssert merged.isSorted(cmp)
|
||||
doAssert merged.len == 12
|
||||
|
||||
block:
|
||||
type
|
||||
Record = object
|
||||
id: int
|
||||
|
||||
proc r(id: int): Record =
|
||||
Record(id: id)
|
||||
|
||||
proc ascendingCmp(x, y: Record): int =
|
||||
if x.id == y.id: return 0
|
||||
if x.id < y.id: return -1
|
||||
result = 1
|
||||
|
||||
proc descendingCmp(x, y: Record): int =
|
||||
if x.id == y.id: return 0
|
||||
if x.id < y.id: return 1
|
||||
result = -1
|
||||
|
||||
var x = @[r(-12), r(1), r(3), r(8), r(13), r(88)]
|
||||
var y = @[r(4), r(7), r(12), r(13), r(77), r(99)]
|
||||
|
||||
var merged: seq[Record]
|
||||
merged.setLen(0)
|
||||
merged.merge(x, y, ascendingCmp)
|
||||
doAssert merged.isSorted(ascendingCmp)
|
||||
doAssert merged == sorted(x & y, ascendingCmp)
|
||||
|
||||
reverse(x)
|
||||
reverse(y)
|
||||
|
||||
merged.setLen(0)
|
||||
merged.merge(x, y, descendingCmp)
|
||||
doAssert merged.isSorted(descendingCmp)
|
||||
doAssert merged == sorted(x & y, ascendingCmp, SortOrder.Descending)
|
||||
|
||||
reverse(x)
|
||||
reverse(y)
|
||||
merged.setLen(0)
|
||||
merged.merge(x, y, proc (x, y: Record): int = -descendingCmp(x, y))
|
||||
doAssert merged.isSorted(proc (x, y: Record): int = -descendingCmp(x, y))
|
||||
doAssert merged == sorted(x & y, ascendingCmp)
|
||||
|
||||
|
||||
var x: seq[(int, int)]
|
||||
x.merge([(1,1)], [(1,2)], (a,b) => a[0] - b[0])
|
||||
doAssert x == @[(1, 1), (1, 2)]
|
||||
|
||||
static: main()
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user