#排序 #游标 #快速排序 #划分 #测试用例 #整数 #基于游标

cursorsort

基于游标划分和枢轴选择器的快速排序实现

7个不稳定版本 (3个破坏性版本)

0.4.0 2024年4月18日
0.3.3 2024年4月8日
0.2.0 2024年4月7日
0.1.0 2024年4月6日

#539 in 算法

自定义许可证

21KB
441

cursorsort

CursorSort是一种使用游标进行划分和选择准确放置的枢轴元素的快速排序算法。它通过选择数组的初始和最后一个元素作为游标,然后在循环中交换元素(如果元素大于两个游标所指的索引,且第一个游标小于第二个,或者相反),来完成这项工作。

此排序算法适用于任何实现PartialOrd特质的类型,并且测试用例涵盖了整数、字母和单词的数组以及字符串的向量。

根据传递给函数的descending参数,它将按升序或降序排序。

概述

算法基本上如下工作

  1. 选择数组的第一个和最后一个元素作为游标

  2. 当第一个游标不等于第二个时,循环步骤3-5

  3. 如果第一个游标处的元素大于第二个游标处的元素 并且 第一个游标小于第二个或者相反,a. 第一个元素较小但第一个游标较大

  4. 假设步骤3为真,则交换第一个和最后一个游标处的元素以及游标本身,否则不执行任何操作。

  5. 如果第一个计数器小于第二个计数器,则递增它,否则递减它。

  6. 这正确放置了枢轴元素,然后从游标(现在是相等的)递归调用函数对数组的左半部和右半部。

安装

要在项目中使用此算法,请运行以下命令

cargo add cursorsort

用法

任何实现PartialOrd特质的类型都可以使用,使用cursorsort函数进行数组/切片和向量的操作。它在原地操作,仅需要core::cmp::PartialOrd作为依赖项,使其与no_std兼容。

如果某物可以转换为Vec,它将能够被排序(假设满足特质要求)。

use cursorsort::cursorsort;

fn main() {
    // For arrays:

    let mut array = [5, 3, 2, 4, 1];
    cursorsort(&mut array, false);
    println!("Sorted array: {:?}", array); // [ 1, 2, 3, 4, 5 ]

    // For Vecs:

    let mut vector = vec![1, 2, 3, 4, 5];
    cursorsort(&mut vector, true);
    println!("Sorted vector: {:?}", vector); // [ 5, 4, 3, 2, 1 ]

    // For Strings:

    // Convert a String to a Vec<u8>
    let mut bytes = String::from("hello world").into_bytes();
    // Sort the vector in place
    cursorsort(&mut bytes, false);
    // Convert the sorted Vec<u8> back into a String
    let sorted_string = String::from_utf8(bytes).expect("Invalid UTF-8");
    println!("Sorted string: {:?}", sorted_string); // " dehllloorw"
}

无运行时依赖项