Skip to content

Commit 087c645

Browse files
authored
Add wiggle_sort (TheAlgorithms#449)
1 parent db1a176 commit 087c645

1 file changed

Lines changed: 54 additions & 0 deletions

File tree

src/sorting/wiggle_sort.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//Wiggle Sort.
2+
//Given an unsorted array nums, reorder it such
3+
//that nums[0] < nums[1] > nums[2] < nums[3]....
4+
//For example:
5+
//if input numbers = [3, 5, 2, 1, 6, 4]
6+
//one possible Wiggle Sorted answer is [3, 5, 1, 6, 2, 4].
7+
8+
pub fn wiggle_sort(nums: Vec<i32>) -> Vec<i32> {
9+
//Rust implementation of wiggle.
10+
// Example:
11+
// >>> wiggle_sort([0, 5, 3, 2, 2])
12+
// [0, 5, 2, 3, 2]
13+
// >>> wiggle_sort([])
14+
// []
15+
// >>> wiggle_sort([-2, -5, -45])
16+
// [-45, -2, -5]
17+
18+
let len = nums.len();
19+
let mut p = nums;
20+
for i in 1..len {
21+
let num_x = p[i - 1];
22+
let num_y = p[i];
23+
if (i % 2 == 1) == (num_x > num_y) {
24+
p[i - 1] = num_y;
25+
p[i] = num_x;
26+
}
27+
}
28+
return p
29+
}
30+
31+
#[cfg(test)]
32+
mod tests {
33+
use super::*;
34+
#[test]
35+
fn wingle_elements() {
36+
let arr = vec![3, 5, 2, 1, 6, 4];
37+
let res = wiggle_sort(arr.clone());
38+
assert_eq!(res, [3, 5, 1, 6, 2, 4]);
39+
}
40+
41+
#[test]
42+
fn odd_number_of_elements() {
43+
let arr = vec![4, 1, 3, 5, 2];
44+
let res = wiggle_sort(arr.clone());
45+
assert_eq!(res, [1, 4, 3, 5, 2]);
46+
}
47+
48+
#[test]
49+
fn repeated_elements() {
50+
let arr = vec![5, 5, 5, 5];
51+
let res = wiggle_sort(arr.clone());
52+
assert_eq!(res, [5, 5, 5, 5]);
53+
}
54+
}

0 commit comments

Comments
 (0)