mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-14 02:10:37 +08:00
Release Rust code to documents. (#656)
This commit is contained in:
@@ -26,7 +26,7 @@ fn bubble_sort(nums: &mut [i32]) {
|
||||
fn bubble_sort_with_flag(nums: &mut [i32]) {
|
||||
// 外循环:未排序区间为 [0, i]
|
||||
for i in (1..nums.len()).rev() {
|
||||
let mut flag = false; // 初始化标志位
|
||||
let mut flag = false; // 初始化标志位
|
||||
// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端
|
||||
for j in 0..i {
|
||||
if nums[j] > nums[j + 1] {
|
||||
@@ -34,10 +34,10 @@ fn bubble_sort_with_flag(nums: &mut [i32]) {
|
||||
let tmp = nums[j];
|
||||
nums[j] = nums[j + 1];
|
||||
nums[j + 1] = tmp;
|
||||
flag = true; // 记录交换元素
|
||||
flag = true; // 记录交换元素
|
||||
}
|
||||
}
|
||||
if !flag {break}; // 此轮冒泡未交换任何元素,直接跳出
|
||||
if !flag {break}; // 此轮冒泡未交换任何元素,直接跳出
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
include!("../include/include.rs");
|
||||
|
||||
/*插入排序 */
|
||||
/* 插入排序 */
|
||||
fn insertion_sort(nums: &mut [i32]) {
|
||||
// 外循环:已排序元素数量为 1, 2, ..., n
|
||||
for i in 1..nums.len() {
|
||||
|
||||
@@ -4,14 +4,10 @@
|
||||
* Author: xBLACKICEx (xBLACKICE@outlook.com)
|
||||
*/
|
||||
|
||||
// 快速排序
|
||||
struct QuickSort;
|
||||
// 快速排序(中位基准数优化)
|
||||
struct QuickSortMedian;
|
||||
// 快速排序(尾递归优化)
|
||||
struct QuickSortTailCall;
|
||||
|
||||
/* 快速排序 */
|
||||
struct QuickSort;
|
||||
|
||||
impl QuickSort {
|
||||
/* 哨兵划分 */
|
||||
fn partition(nums: &mut [i32], left: usize, right: usize) -> usize {
|
||||
@@ -19,15 +15,15 @@ impl QuickSort {
|
||||
let (mut i, mut j) = (left, right);
|
||||
while i < j {
|
||||
while i < j && nums[j] >= nums[left] {
|
||||
j -= 1; // 从右向左找首个小于基准数的元素
|
||||
j -= 1; // 从右向左找首个小于基准数的元素
|
||||
}
|
||||
while i < j && nums[i] <= nums[left] {
|
||||
i += 1; // 从左向右找首个大于基准数的元素
|
||||
i += 1; // 从左向右找首个大于基准数的元素
|
||||
}
|
||||
nums.swap(i, j); // 交换这两个元素
|
||||
}
|
||||
nums.swap(i, left); // 将基准数交换至两子数组的分界线
|
||||
i // 返回基准数的索引
|
||||
nums.swap(i, left); // 将基准数交换至两子数组的分界线
|
||||
i // 返回基准数的索引
|
||||
}
|
||||
|
||||
/* 快速排序 */
|
||||
@@ -45,6 +41,8 @@ impl QuickSort {
|
||||
}
|
||||
|
||||
/* 快速排序(中位基准数优化) */
|
||||
struct QuickSortMedian;
|
||||
|
||||
impl QuickSortMedian {
|
||||
/* 选取三个元素的中位数 */
|
||||
fn median_three(nums: &mut [i32], left: usize, mid: usize, right: usize) -> usize {
|
||||
@@ -66,17 +64,17 @@ impl QuickSortMedian {
|
||||
nums.swap(left, med);
|
||||
// 以 nums[left] 作为基准数
|
||||
let (mut i, mut j) = (left, right);
|
||||
while i < j {
|
||||
while i < j && nums[j] >= nums[left] {
|
||||
j -= 1; // 从右向左找首个小于基准数的元素
|
||||
}
|
||||
while i < j && nums[i] <= nums[left] {
|
||||
i += 1; // 从左向右找首个大于基准数的元素
|
||||
}
|
||||
nums.swap(i, j); // 交换这两个元素
|
||||
}
|
||||
nums.swap(i, left); // 将基准数交换至两子数组的分界线
|
||||
i // 返回基准数的索引
|
||||
while i < j {
|
||||
while i < j && nums[j] >= nums[left] {
|
||||
j -= 1; // 从右向左找首个小于基准数的元素
|
||||
}
|
||||
while i < j && nums[i] <= nums[left] {
|
||||
i += 1; // 从左向右找首个大于基准数的元素
|
||||
}
|
||||
nums.swap(i, j); // 交换这两个元素
|
||||
}
|
||||
nums.swap(i, left); // 将基准数交换至两子数组的分界线
|
||||
i // 返回基准数的索引
|
||||
}
|
||||
|
||||
/* 快速排序 */
|
||||
@@ -94,23 +92,24 @@ impl QuickSortMedian {
|
||||
}
|
||||
|
||||
/* 快速排序(尾递归优化) */
|
||||
struct QuickSortTailCall;
|
||||
|
||||
impl QuickSortTailCall {
|
||||
/* 哨兵划分 */
|
||||
fn partition(nums: &mut [i32], left: usize, right: usize) -> usize {
|
||||
// 以 nums[left] 作为基准数
|
||||
let (mut i, mut j) = (left, right);
|
||||
|
||||
while i < j {
|
||||
while i < j && nums[j] >= nums[left] {
|
||||
j -= 1; // 从右向左找首个小于基准数的元素
|
||||
j -= 1; // 从右向左找首个小于基准数的元素
|
||||
}
|
||||
while i < j && nums[i] <= nums[left] {
|
||||
i += 1; // 从左向右找首个大于基准数的元素
|
||||
i += 1; // 从左向右找首个大于基准数的元素
|
||||
}
|
||||
nums.swap(i, j); // 交换这两个元素
|
||||
}
|
||||
nums.swap(i, left); // 将基准数交换至两子数组的分界线
|
||||
i // 返回基准数的索引
|
||||
nums.swap(i, left); // 将基准数交换至两子数组的分界线
|
||||
i // 返回基准数的索引
|
||||
}
|
||||
|
||||
/* 快速排序(尾递归优化) */
|
||||
@@ -131,6 +130,7 @@ impl QuickSortTailCall {
|
||||
}
|
||||
}
|
||||
|
||||
/* Driver Code */
|
||||
fn main() {
|
||||
/* 快速排序 */
|
||||
let mut nums = [2, 4, 1, 0, 3, 5];
|
||||
@@ -146,4 +146,4 @@ fn main() {
|
||||
let mut nums = [2, 4, 1, 0, 3, 5];
|
||||
QuickSortTailCall::quick_sort(0, (nums.len() - 1) as i32, &mut nums);
|
||||
println!("快速排序(尾递归优化)完成后 nums = {:?}", nums);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user