1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
extern crate js_sys; extern crate wasm_bindgen; extern crate wee_alloc; use wasm_bindgen::prelude::*; #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; pub fn bubble_sort<T: PartialOrd>(v: &mut Vec<T>) { let l = v.len(); for i in 0..(l - 1) { for j in (i + 1)..l { if v[i] > v[j] { v.swap(i, j); } } } } #[wasm_bindgen] pub fn bubble_sort_int32array(a: &js_sys::Int32Array) -> Vec<i32> { let mut v = a.to_vec(); bubble_sort(&mut v); v } #[wasm_bindgen] pub fn bubble_sort_int16array(a: &js_sys::Int16Array) -> Vec<i16> { let mut v = a.to_vec(); bubble_sort(&mut v); v } #[wasm_bindgen] pub fn bubble_sort_int8array(a: &js_sys::Int8Array) -> Vec<i8> { let mut v = a.to_vec(); bubble_sort(&mut v); v } #[wasm_bindgen] pub fn bubble_sort_uint32array(a: &js_sys::Uint32Array) -> Vec<u32> { let mut v = a.to_vec(); bubble_sort(&mut v); v } #[wasm_bindgen] pub fn bubble_sort_uint16array(a: &js_sys::Uint16Array) -> Vec<u16> { let mut v = a.to_vec(); bubble_sort(&mut v); v } #[wasm_bindgen] pub fn bubble_sort_uint8array(a: &js_sys::Uint8Array) -> Vec<u8> { let mut v = a.to_vec(); bubble_sort(&mut v); v } #[wasm_bindgen] pub fn bubble_sort_float64array(a: &js_sys::Float64Array) -> Vec<f64> { let mut v = a.to_vec(); bubble_sort(&mut v); v } #[wasm_bindgen] pub fn bubble_sort_float32array(a: &js_sys::Float32Array) -> Vec<f32> { let mut v = a.to_vec(); bubble_sort(&mut v); v } pub fn merge_sort<T: PartialOrd + Clone>(v: &mut [T]) -> Vec<T> { let l = v.len(); if l < 2 { return v.to_vec(); } let m = (l as f64 / 2.).floor() as usize; let (lp, rp) = v.split_at_mut(m); let mut lv = merge_sort(lp); let mut rv = merge_sort(rp); let lvl = lv.len(); let rvl = rv.len(); let mut li = 0; let mut ri = 0; let mut new_v = Vec::with_capacity(l); for _ in 0..l { if lv[li] > rv[ri] { new_v.push(rv[ri].clone()); ri += 1; } else { new_v.push(lv[li].clone()); li += 1; } if li == lvl { new_v.extend_from_slice(rv.split_off(ri).as_slice()); break; } if ri == rvl { new_v.extend_from_slice(lv.split_off(li).as_slice()); break; } } return new_v; } #[wasm_bindgen] pub fn merge_sort_int32array(a: &js_sys::Int32Array) -> Vec<i32> { let mut v = a.to_vec(); merge_sort(&mut v) } #[wasm_bindgen] pub fn merge_sort_int16array(a: &js_sys::Int16Array) -> Vec<i16> { let mut v = a.to_vec(); merge_sort(&mut v) } #[wasm_bindgen] pub fn merge_sort_int8array(a: &js_sys::Int8Array) -> Vec<i8> { let mut v = a.to_vec(); merge_sort(&mut v) } #[wasm_bindgen] pub fn merge_sort_uint32array(a: &js_sys::Uint32Array) -> Vec<u32> { let mut v = a.to_vec(); merge_sort(&mut v) } #[wasm_bindgen] pub fn merge_sort_uint16array(a: &js_sys::Uint16Array) -> Vec<u16> { let mut v = a.to_vec(); merge_sort(&mut v) } #[wasm_bindgen] pub fn merge_sort_uint8array(a: &js_sys::Uint8Array) -> Vec<u8> { let mut v = a.to_vec(); merge_sort(&mut v) } #[wasm_bindgen] pub fn merge_sort_float64array(a: &js_sys::Float64Array) -> Vec<f64> { let mut v = a.to_vec(); merge_sort(&mut v) } #[wasm_bindgen] pub fn merge_sort_float32array(a: &js_sys::Float32Array) -> Vec<f32> { let mut v = a.to_vec(); merge_sort(&mut v) }