diff --git a/src/sorting/src/bubble_sort.cairo b/src/sorting/src/bubble_sort.cairo index 470f580a..1a03a995 100644 --- a/src/sorting/src/bubble_sort.cairo +++ b/src/sorting/src/bubble_sort.cairo @@ -5,7 +5,9 @@ /// * `array` - Array to sort /// # Returns /// * `Array` - Sorted array -fn bubble_sort_elements, +Drop, +PartialOrd>(mut array: Array) -> Array { +fn bubble_sort_elements, +Drop, +PartialOrd, +PartialEq>( + mut array: Array, asc: bool +) -> Array { if array.len() <= 1 { return array; } @@ -26,7 +28,7 @@ fn bubble_sort_elements, +Drop, +PartialOrd>(mut array: Array< idx2 = 1; sorted_iteration = 0; } else { - if *array[idx1] <= *array[idx2] { + if (*array[idx1] == *array[idx2]) || !((asc) ^ (*array[idx1] < *array[idx2])) { sorted_array.append(*array[idx1]); idx1 = idx2; idx2 += 1; diff --git a/src/sorting/src/tests/bubble_sort_test.cairo b/src/sorting/src/tests/bubble_sort_test.cairo index c6bbf8a3..a52c3003 100644 --- a/src/sorting/src/tests/bubble_sort_test.cairo +++ b/src/sorting/src/tests/bubble_sort_test.cairo @@ -6,7 +6,7 @@ fn bubblesort_test() { let mut data = array![4_u32, 2_u32, 1_u32, 3_u32, 5_u32, 0_u32]; let mut correct = array![0_u32, 1_u32, 2_u32, 3_u32, 4_u32, 5_u32]; - let sorted = bubble_sort::bubble_sort_elements(data); + let sorted = bubble_sort::bubble_sort_elements(data, true); assert(is_equal(sorted.span(), correct.span()), 'invalid result'); } @@ -18,7 +18,7 @@ fn bubblesort_test_empty() { let mut data = array![]; let mut correct = array![]; - let sorted = bubble_sort::bubble_sort_elements(data); + let sorted = bubble_sort::bubble_sort_elements(data, true); assert(is_equal(sorted.span(), correct.span()), 'invalid result'); } @@ -29,7 +29,7 @@ fn bubblesort_test_one_element() { let mut data = array![2_u32]; let mut correct = array![2_u32]; - let sorted = bubble_sort::bubble_sort_elements(data); + let sorted = bubble_sort::bubble_sort_elements(data, true); assert(is_equal(sorted.span(), correct.span()), 'invalid result'); } @@ -40,7 +40,7 @@ fn bubblesort_test_pre_sorted() { let mut data = array![1_u32, 2_u32, 3_u32, 4_u32]; let mut correct = array![1_u32, 2_u32, 3_u32, 4_u32]; - let sorted = bubble_sort::bubble_sort_elements(data); + let sorted = bubble_sort::bubble_sort_elements(data, true); assert(is_equal(sorted.span(), correct.span()), 'invalid result'); } @@ -51,7 +51,7 @@ fn bubblesort_test_pre_sorted_decreasing() { let mut data = array![4_u32, 3_u32, 2_u32, 1_u32]; let mut correct = array![1_u32, 2_u32, 3_u32, 4_u32]; - let sorted = bubble_sort::bubble_sort_elements(data); + let sorted = bubble_sort::bubble_sort_elements(data, true); assert(is_equal(sorted.span(), correct.span()), 'invalid result'); } @@ -62,7 +62,7 @@ fn bubblesort_test_pre_sorted_2_same_values() { let mut data = array![1_u32, 2_u32, 2_u32, 4_u32]; let mut correct = array![1_u32, 2_u32, 2_u32, 4_u32]; - let sorted = bubble_sort::bubble_sort_elements(data); + let sorted = bubble_sort::bubble_sort_elements(data, true); assert(is_equal(sorted.span(), correct.span()), 'invalid result'); } @@ -73,7 +73,85 @@ fn bubblesort_test_2_same_values() { let mut data = array![1_u32, 2_u32, 4_u32, 2_u32]; let mut correct = array![1_u32, 2_u32, 2_u32, 4_u32]; - let sorted = bubble_sort::bubble_sort_elements(data); + let sorted = bubble_sort::bubble_sort_elements(data, true); + + assert(is_equal(sorted.span(), correct.span()), 'invalid result'); +} + +#[test] +#[available_gas(20000000000000)] +fn bubblesort_test_dsc() { + let mut data = array![4_u32, 2_u32, 1_u32, 3_u32, 5_u32, 0_u32]; + let mut correct = array![5_u32, 4_u32, 3_u32, 2_u32, 1_u32, 0_u32]; + + let sorted = bubble_sort::bubble_sort_elements(data, false); + + assert(is_equal(sorted.span(), correct.span()), 'invalid result'); +} + + +#[test] +#[available_gas(2000000)] +fn bubblesort_test_empty_dsc() { + let mut data = array![]; + let mut correct = array![]; + + let sorted = bubble_sort::bubble_sort_elements(data, false); + + assert(is_equal(sorted.span(), correct.span()), 'invalid result'); +} + +#[test] +#[available_gas(2000000)] +fn bubblesort_test_one_element_dsc() { + let mut data = array![2_u32]; + let mut correct = array![2_u32]; + + let sorted = bubble_sort::bubble_sort_elements(data, false); + + assert(is_equal(sorted.span(), correct.span()), 'invalid result'); +} + +#[test] +#[available_gas(2000000)] +fn bubblesort_test_pre_sorted_dsc() { + let mut data = array![1_u32, 2_u32, 3_u32, 4_u32]; + let mut correct = array![4_u32, 3_u32, 2_u32, 1_u32]; + + let sorted = bubble_sort::bubble_sort_elements(data, false); + + assert(is_equal(sorted.span(), correct.span()), 'invalid result'); +} + +#[test] +#[available_gas(2000000)] +fn bubblesort_test_pre_sorted_decreasing_dsc() { + let mut data = array![4_u32, 3_u32, 2_u32, 1_u32]; + let mut correct = array![4_u32, 3_u32, 2_u32, 1_u32]; + + let sorted = bubble_sort::bubble_sort_elements(data, false); + + assert(is_equal(sorted.span(), correct.span()), 'invalid result'); +} + +#[test] +#[available_gas(2000000)] +fn bubblesort_test_pre_sorted_2_same_values_dsc() { + let mut data = array![1_u32, 2_u32, 2_u32, 4_u32]; + let mut correct = array![4_u32, 2_u32, 2_u32, 1_u32]; + + let sorted = bubble_sort::bubble_sort_elements(data, false); + + assert(is_equal(sorted.span(), correct.span()), 'invalid result'); +} + +#[test] +#[available_gas(2000000)] +fn bubblesort_test_2_same_values_dsc() { + let mut data = array![1_u32, 2_u32, 4_u32, 2_u32]; + let mut correct = array![4_u32, 2_u32, 2_u32, 1_u32]; + + let sorted = bubble_sort::bubble_sort_elements(data, false); assert(is_equal(sorted.span(), correct.span()), 'invalid result'); }