From 6a80405a55699636c2f251754ff3a51adb2c1ad5 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Fri, 20 Oct 2017 02:55:28 +0200 Subject: [PATCH] sorting fixes --- src/structure/collections/sort.ts | 21 ++++++++++++++++++--- src/structure/spec/collections.spec.ts | 6 ++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/structure/collections/sort.ts b/src/structure/collections/sort.ts index 5f3a78801..0fa91e347 100644 --- a/src/structure/collections/sort.ts +++ b/src/structure/collections/sort.ts @@ -84,9 +84,24 @@ function partitionArrayAsc(data: number[], parts: number[], l: number, r: number parts[1] = tail; } +function insertionSort({ data, cmp, swap }: Ctx, start: number, end: number) { + for (let i = start + 1; i <= end; i++) { + let j = i - 1; + while (j >= start && cmp(data, j, j + 1) > 0) { + swap(data, j, j + 1); + j = j - 1; + } + } +} + function quickSort(ctx: Ctx, low: number, high: number) { const { parts } = ctx; while (low < high) { + if (high - low < 16) { + insertionSort(ctx, low, high); + return; + } + partitionGeneric(ctx, low, high); const li = parts[0], ri = parts[1]; @@ -100,11 +115,11 @@ function quickSort(ctx: Ctx, low: number, high: number) { } } -function insertionSort(data: number[], start: number, end: number) { +function insertionSortArrayAsc(data: number[], start: number, end: number) { for (let i = start + 1; i <= end; i++) { const key = data[i]; let j = i - 1; - while (j >= 0 && data[j] > key) { + while (j >= start && data[j] > key) { data[j + 1] = data[j]; j = j - 1; } @@ -115,7 +130,7 @@ function insertionSort(data: number[], start: number, end: number) { function quickSortArrayAsc(data: number[], parts: number[], low: number, high: number) { while (low < high) { if (high - low < 16) { - insertionSort(data, low, high); + insertionSortArrayAsc(data, low, high); return; } diff --git a/src/structure/spec/collections.spec.ts b/src/structure/spec/collections.spec.ts index 6ade6097f..d3b4489d8 100644 --- a/src/structure/spec/collections.spec.ts +++ b/src/structure/spec/collections.spec.ts @@ -50,7 +50,8 @@ function shuffleArray(data: any[]) { } describe('qsort-array asc', () => { - const data0 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + const data0 = new Array(50); + for (let i = 0; i < data0.length; i++) data0[i] = i; const data1 = [1, 1, 2, 2, 3, 3, 4, 4, 4, 6, 6, 6]; function test(name: string, data: any[], randomize: boolean) { @@ -72,7 +73,8 @@ describe('qsort-array asc', () => { }) describe('qsort-array generic', () => { - const data0 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + const data0 = new Array(50); + for (let i = 0; i < data0.length; i++) data0[i] = i; const data1 = [1, 1, 2, 2, 3, 3, 4, 4, 4, 6, 6, 6]; function test(name: string, data: any[], randomize: boolean) { -- GitLab