mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-05 00:01:37 +08:00
Fix wiggle sort (#991)
Co-authored-by: Antonia Strack <antonia.strack@thm.mni.de>
This commit is contained in:
36
Sorts/SimplifiedWiggleSort.js
Normal file
36
Sorts/SimplifiedWiggleSort.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Wiggle sort sorts the array into a wave like array.
|
||||||
|
* An array ‘arr[0..n-1]’ is sorted in wave form if arr[0] <= arr[1] >= arr[2] <= arr[3] >= arr[4] <= …..
|
||||||
|
* KEEP IN MIND: there are also more strict definitions of wiggle sort which use
|
||||||
|
* the rule arr[0] < arr[1] > arr[2] < arr[3] > arr[4] < … but this function
|
||||||
|
* allows for equality of values next to each other.
|
||||||
|
*/
|
||||||
|
import { quickSelectSearch } from '../Search/QuickSelectSearch.js'
|
||||||
|
|
||||||
|
export const simplifiedWiggleSort = function (arr) {
|
||||||
|
// find Median using QuickSelect
|
||||||
|
let median = quickSelectSearch(arr, Math.floor(arr.length / 2.0))
|
||||||
|
median = median[Math.floor(arr.length / 2.0)]
|
||||||
|
|
||||||
|
const sorted = new Array(arr.length)
|
||||||
|
|
||||||
|
let smallerThanMedianIndx = 0
|
||||||
|
let greaterThanMedianIndx = arr.length - 1 - (arr.length % 2)
|
||||||
|
|
||||||
|
for (let i = 0; i < arr.length; i++) {
|
||||||
|
if (arr[i] > median) {
|
||||||
|
sorted[greaterThanMedianIndx] = arr[i]
|
||||||
|
greaterThanMedianIndx -= 2
|
||||||
|
} else {
|
||||||
|
if (smallerThanMedianIndx < arr.length) {
|
||||||
|
sorted[smallerThanMedianIndx] = arr[i]
|
||||||
|
smallerThanMedianIndx += 2
|
||||||
|
} else {
|
||||||
|
sorted[greaterThanMedianIndx] = arr[i]
|
||||||
|
greaterThanMedianIndx -= 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sorted
|
||||||
|
}
|
@ -1,21 +0,0 @@
|
|||||||
/*
|
|
||||||
* Wiggle sort sorts the array into a wave like array.
|
|
||||||
* An array ‘arr[0..n-1]’ is sorted in wave form if arr[0] >= arr[1] <= arr[2] >= arr[3] <= arr[4] >= …..
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const wiggleSort = function (arr) {
|
|
||||||
for (let i = 0; i < arr.length; ++i) {
|
|
||||||
const shouldNotBeLessThan = i % 2
|
|
||||||
const isLessThan = arr[i] < arr[i + 1]
|
|
||||||
if (shouldNotBeLessThan && isLessThan) {
|
|
||||||
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return arr
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implementation of wiggle sort
|
|
||||||
|
|
||||||
// > wiggleSort([3, 5, 2, 1, 6, 4])
|
|
||||||
// [ 3, 5, 2, 6, 1, 4 ]
|
|
24
Sorts/test/SimplifiedWiggleSort.test.js
Normal file
24
Sorts/test/SimplifiedWiggleSort.test.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { simplifiedWiggleSort } from '../SimplifiedWiggleSort.js'
|
||||||
|
|
||||||
|
describe('simplified wiggle sort', () => {
|
||||||
|
test('simplified wiggle sort for chars', () => {
|
||||||
|
const src = ['a', 'b', 'c']
|
||||||
|
expect(simplifiedWiggleSort(src)).toEqual(['a', 'c', 'b'])
|
||||||
|
})
|
||||||
|
|
||||||
|
test('wiggle sort with duplicates, even array', () => {
|
||||||
|
const src = [2, 2, 1, 3]
|
||||||
|
expect(simplifiedWiggleSort(src)).toEqual([1, 3, 2, 2])
|
||||||
|
})
|
||||||
|
|
||||||
|
test('wiggle sort with duplicates, odd array', () => {
|
||||||
|
const src = [1, 1, 1, 2, 4]
|
||||||
|
expect(simplifiedWiggleSort(src)).toEqual([1, 4, 1, 2, 1])
|
||||||
|
})
|
||||||
|
|
||||||
|
test('simplified wiggle sort which leads to equal values next to ' +
|
||||||
|
'each other', () => {
|
||||||
|
const src = [3, 3, 5, 1]
|
||||||
|
expect(simplifiedWiggleSort(src)).toEqual([1, 5, 3, 3])
|
||||||
|
})
|
||||||
|
})
|
Reference in New Issue
Block a user