diff --git a/doc/sorting/_index.md b/doc/sorting/_index.md index 41ce624..d3526c4 100644 --- a/doc/sorting/_index.md +++ b/doc/sorting/_index.md @@ -5,21 +5,30 @@ math: true + 插入排序 + 选择排序 - -| 排序 | 是否稳定 | 最坏情况时间 | 平均/期望时间 | -|----------|----------|-------------------|-------------------| ++ 冒泡排序 +| 排序 | 是否稳定 | 最坏情况时间 | 平均/期望时间 | +|----------|----------|--------------------|--------------------| | 插入排序 | 稳定 | $ \Theta( n ^ 2) $ | $ \Theta( n ^ 2) $ | | 选择排序 | 不稳定 | $ \Theta( n ^ 2) $ | $ \Theta( n ^ 2) $ | +| 冒泡排序 | 稳定 | $ O( n ^ 2 ) $ | $ O( n ^ 2 ) $ | ## 插入排序 -插入排序将元素插入到已排序序列的正确位置 并扩展已排序序列的边界 +从第 **0** 个元素作为有序序列开始, 插入排序将元素 **插入** 到 **已排序序列** 的正确位置 并扩展已排序序列的边界 [![Insertion_sort](./insertion_sort.svg)](./insertion_sort.svg) ## 选择排序 -选择排序按照指定的闭包每次找到第i最符合闭包条件的元素并放到i上 +选择排序按照指定的 **闭包** 每次找到第i最符合闭包条件的元素 并放到 **i** 上 [![Selection_Sort](./selection_sort.svg)](./selection_sort.svg) + +## 冒泡排序 +比较相邻的元素 如果 **顺序不一样** 则交换 + +当第 **1** 次循环结束后 ,最后的元素将成为 **最大** 的元素, 并收缩右边界 + +[![Bubble_Sort](./bubble_sort.gif)](./bubble_sort.gif) + diff --git a/doc/sorting/bubble_sort.gif b/doc/sorting/bubble_sort.gif new file mode 100644 index 0000000..5f767d4 Binary files /dev/null and b/doc/sorting/bubble_sort.gif differ diff --git a/src/sorting/bubble_sort.rs b/src/sorting/bubble_sort.rs new file mode 100644 index 0000000..656cba3 --- /dev/null +++ b/src/sorting/bubble_sort.rs @@ -0,0 +1,43 @@ +/// Bubble Sort +/// # Example +/// ``` +/// use algori::sorting::{bubble_sort,is_sorted}; +/// let mut a = [2,3,1,34,15,8,0,7,4,3,21,4,6,7,4,2341,321,41231,312,62]; +/// bubble_sort(&mut a,|a,b| a <= b); +/// is_sorted(&mut a,|a,b| a<=b); +/// ``` +pub fn bubble_sort(array: &mut [T], comparator: fn(&T, &T) -> bool) -> () { + for point in (0..array.len()).rev() { + for current_point in 0..point { + if !comparator(&array[current_point],&array[current_point+1]) { + array.swap(current_point,current_point + 1); + } + } + } +} + +#[cfg(test)] +mod bubble_sort_tests { + use super::super::is_sorted; + use super::bubble_sort; + #[test] + fn empty() -> () { + let mut a: [i32; 0] = []; + bubble_sort(&mut a, |a, b| a <= b); + + assert_eq!(is_sorted(&mut a, |a, b| a <= b), true); + } + + #[test] + fn one_element() -> () { + let mut a: [i32; 1] = [1]; + bubble_sort(&mut a, |a, b| a <= b); + assert_eq!(is_sorted(&mut a, |a, b| a <= b), true); + } + #[test] + fn positive() -> () { + let mut a = [1, 123, 123, 12, 4234, 42, 1123, 123, 15112, 312]; + bubble_sort(&mut a, |a, b| a >= b); + assert_eq!(is_sorted(&mut a, |a, b| a >= b), true); + } +} diff --git a/src/sorting/insertion_sort.rs b/src/sorting/insertion_sort.rs index 285296b..ee0969a 100644 --- a/src/sorting/insertion_sort.rs +++ b/src/sorting/insertion_sort.rs @@ -1,4 +1,4 @@ -/// # Insertion Sort +/// Insertion Sort /// # Example /// ``` /// use algori::sorting::{insertion_sort,is_sorted}; diff --git a/src/sorting/mod.rs b/src/sorting/mod.rs index 84365e6..9f995ee 100644 --- a/src/sorting/mod.rs +++ b/src/sorting/mod.rs @@ -1,7 +1,9 @@ mod insertion_sort; mod selection_sort; mod utils; +mod bubble_sort; pub use self::insertion_sort::*; pub use self::selection_sort::*; pub use self::utils::*; +pub use self::bubble_sort::*; diff --git a/src/sorting/selection_sort.rs b/src/sorting/selection_sort.rs index f54ce69..29818fe 100644 --- a/src/sorting/selection_sort.rs +++ b/src/sorting/selection_sort.rs @@ -1,4 +1,4 @@ -/// # Selection Sort +/// Selection Sort /// # Example /// ``` /// use algori::sorting::{selection_sort,is_sorted}; @@ -39,7 +39,7 @@ mod selection_sort_tests { #[test] fn positive() -> () { let mut a = [1, 123, 123, 12, 4234, 42, 1123, 123, 15112, 312]; - selection_sort(&mut a, |a, b| a <= b); - assert_eq!(is_sorted(&mut a, |a, b| a <= b), true); + selection_sort(&mut a, |a, b| a >= b); + assert_eq!(is_sorted(&mut a, |a, b| a >= b), true); } }