Skip to content

Commit efbcaed

Browse files
committed
add quick sort
1 parent 2dcaac7 commit efbcaed

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

code/examples/sort/Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "sort"
3+
version = "0.1.0"
4+
authors = ["jameskk <[email protected]>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]

code/examples/sort/src/main.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
fn main() {
2+
let mut a = [12,232,234,2,34,234,234,2,34,2,34,234,234,2,34,234,2,34,2,34,234,2,34,2];
3+
quick(&mut a);
4+
for item in &a {
5+
println!("{}", item);
6+
}
7+
}
8+
9+
fn quick(arr: &mut [i32]) {
10+
quick_sort(arr, 0, (arr.len() - 1) as usize);
11+
}
12+
13+
fn quick_sort(arr: &mut [i32], start: usize, end: usize) {
14+
if start >= end {
15+
return;
16+
}
17+
let pivot_idx = partition(arr, start, end);
18+
quick_sort(arr, start, pivot_idx - 1);
19+
quick_sort(arr, pivot_idx + 1, end);
20+
}
21+
22+
fn partition(arr: &mut [i32], start: usize, end: usize) -> usize {
23+
let pivot_val = arr[start];
24+
let mut left = start;
25+
let mut right = end + 1;
26+
loop {
27+
loop {
28+
left += 1;
29+
if arr[left] > pivot_val || left == end {
30+
break;
31+
}
32+
}
33+
loop {
34+
right -= 1;
35+
if arr[right] <= pivot_val || right == start {
36+
break;
37+
}
38+
}
39+
if left >= right {
40+
break;
41+
}
42+
swap(arr, left, right);
43+
}
44+
swap(arr, start, right);
45+
right
46+
}
47+
48+
fn swap(arr: &mut [i32], a: usize, b: usize) {
49+
let tmp = arr[a];
50+
arr[a] = arr[b];
51+
arr[b] = tmp;
52+
}

0 commit comments

Comments
 (0)