Skip to content

Commit 76aff03

Browse files
committed
Refactor flash_sort.py to resolve Ruff check errors
1 parent 098147f commit 76aff03

File tree

1 file changed

+98
-52
lines changed

1 file changed

+98
-52
lines changed

sorts/flash_sort.py

+98-52
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,100 @@
1-
#!/usr/bin/env python
2-
3-
import argparse
4-
import os
5-
from typing import List
6-
7-
class FlashSorter:
8-
def __init__(self, filename: str):
9-
self.filename = filename
10-
11-
def sort(self) -> None:
12-
# Main logic for flash sort goes here
13-
pass
14-
15-
def _flash_sort(self, data: List[int]) -> List[int]:
16-
# Implement the flash sort algorithm
17-
pass
18-
19-
def _read_file(self) -> List[int]:
20-
with open(self.filename, 'r') as file:
21-
return [int(line.strip()) for line in file]
22-
23-
def _write_file(self, data: List[int]) -> None:
24-
with open(self.filename + ".out", 'w') as file:
25-
for number in data:
26-
file.write(f"{number}\n")
27-
28-
def parse_memory(string: str) -> int:
29-
if string[-1].lower() == "k":
30-
return int(string[:-1]) * 1024
31-
elif string[-1].lower() == "m":
32-
return int(string[:-1]) * 1024 * 1024
33-
elif string[-1].lower() == "g":
34-
return int(string[:-1]) * 1024 * 1024 * 1024
35-
else:
36-
return int(string)
37-
38-
def main() -> None:
39-
parser = argparse.ArgumentParser()
40-
parser.add_argument(
41-
"-m", "--mem", help="amount of memory to use for sorting", default="100M"
42-
)
43-
parser.add_argument(
44-
"filename", metavar="<filename>", nargs=1, help="name of file to sort"
45-
)
46-
args = parser.parse_args()
47-
48-
sorter = FlashSorter(args.filename[0])
49-
data = sorter._read_file()
50-
sorted_data = sorter._flash_sort(data)
51-
sorter._write_file(sorted_data)
1+
"""
2+
Implementation of Flash Sort in Python
3+
Author: Yash Kiradoo
4+
5+
For doctests, run the following command:
6+
python3 -m doctest -v flash_sort.py
7+
8+
For manual testing, run:
9+
python3 flash_sort.py
10+
"""
11+
12+
from __future__ import annotations
13+
from typing import Callable
14+
15+
16+
class FlashSort:
17+
def __init__(self, arr: list[int], n_classes: int, sort_key: Callable[[int], int] = lambda x: x):
18+
self.arr = arr
19+
self.n = len(arr)
20+
self.n_classes = n_classes
21+
self.sort_key = sort_key
22+
23+
def flash_sort(self) -> None:
24+
"""
25+
Performs flash sort on the array in-place.
26+
27+
>>> arr = [5, 3, 8, 6, 2, 7, 4, 1]
28+
>>> sorter = FlashSort(arr, n_classes=5)
29+
>>> sorter.flash_sort()
30+
>>> arr
31+
[1, 2, 3, 4, 5, 6, 7, 8]
32+
33+
>>> arr = [1]
34+
>>> sorter = FlashSort(arr, n_classes=1)
35+
>>> sorter.flash_sort()
36+
>>> arr
37+
[1]
38+
39+
>>> arr = [2, 2, 2]
40+
>>> sorter = FlashSort(arr, n_classes=2)
41+
>>> sorter.flash_sort()
42+
>>> arr
43+
[2, 2, 2]
44+
"""
45+
if self.n <= 1:
46+
return
47+
48+
min_val = min(self.arr, key=self.sort_key)
49+
max_val = max(self.arr, key=self.sort_key)
50+
51+
if self.sort_key(min_val) == self.sort_key(max_val):
52+
return
53+
54+
L = [0] * self.n_classes
55+
c1 = (self.n_classes - 1) / (self.sort_key(max_val) - self.sort_key(min_val))
56+
57+
# Classification step
58+
for i in range(self.n):
59+
k = int(c1 * (self.sort_key(self.arr[i]) - self.sort_key(min_val)))
60+
L[k] += 1
61+
62+
# Cumulative step
63+
for i in range(1, self.n_classes):
64+
L[i] += L[i - 1]
65+
66+
# Permutation step
67+
i, nmove, flash = 0, 0, self.arr[0]
68+
while nmove < self.n:
69+
while i >= L[int(c1 * (self.sort_key(flash) - self.sort_key(min_val)))]:
70+
i += 1
71+
flash = self.arr[i]
72+
k = int(c1 * (self.sort_key(flash) - self.sort_key(min_val)))
73+
74+
while i != L[k]:
75+
k = int(c1 * (self.sort_key(flash) - self.sort_key(min_val)))
76+
hold = self.arr[L[k] - 1]
77+
self.arr[L[k] - 1] = flash
78+
flash = hold
79+
L[k] -= 1
80+
nmove += 1
81+
82+
# Final step: Insertion sort to finish
83+
for i in range(1, self.n):
84+
key_item = self.arr[i]
85+
j = i - 1
86+
while j >= 0 and self.arr[j] > key_item:
87+
self.arr[j + 1] = self.arr[j]
88+
j -= 1
89+
self.arr[j + 1] = key_item
90+
5291

5392
if __name__ == "__main__":
54-
main()
93+
user_input = input("Enter numbers separated by a comma:\n").strip()
94+
if user_input == "":
95+
unsorted = []
96+
else:
97+
unsorted = [int(item.strip()) for item in user_input.split(",")]
98+
sorter = FlashSort(unsorted, n_classes=5)
99+
sorter.flash_sort()
100+
print(unsorted)

0 commit comments

Comments
 (0)