Bộ sắp xếp dòng
Sắp xếp các dòng theo thứ tự bảng chữ cái, theo độ dài, đảo ngược hoặc ngẫu nhiên
Dòng đầu vào
Dòng được sắp xếp
Sắp Xếp Dòng Là Gì?
Sắp xếp dòng là quá trình sắp xếp lại các dòng trong một khối văn bản theo một quy tắc cụ thể: thứ tự bảng chữ cái, thứ tự ngược, độ dài dòng, hoặc xáo trộn ngẫu nhiên. Sắp xếp dòng trực tuyến là tác vụ phổ biến khi làm việc với tệp log, dữ liệu CSV, danh sách cấu hình, hoặc bất kỳ nội dung văn bản thuần nào có thứ tự quan trọng. Thao tác này tách văn bản theo ký tự xuống dòng, áp dụng hàm so sánh lên mảng kết quả, rồi ghép các dòng đã sắp xếp lại với nhau.
Hầu hết các ngôn ngữ lập trình sắp xếp chuỗi theo thứ tự từ điển (lexicographic) theo mặc định, tức là so sánh ký tự theo giá trị Unicode code point. Điều này có nghĩa là chữ hoa sẽ đứng trước chữ thường ("Banana" trước "apple"), và chữ số đứng trước chữ cái. Sắp xếp có nhận thức về ngôn ngữ (locale-aware), đôi khi gọi là natural sort hoặc collation, khắc phục điều này bằng cách áp dụng các quy tắc riêng của từng ngôn ngữ. localeCompare() trong JavaScript, locale.strxfrm() trong Python, và lệnh POSIX sort với LC_COLLATE đều cung cấp thứ tự có nhận thức về ngôn ngữ.
Sắp xếp theo độ dài hữu ích khi bạn cần tìm các mục ngắn nhất hoặc dài nhất trong danh sách, xác định các giá trị ngoại lệ trong đầu ra log, hoặc sắp xếp các mục theo độ phức tạp. Sắp xếp ngược đảo thứ tự dòng hiện có mà không sắp xếp lại, điều này khác với sắp xếp Z-A theo bảng chữ cái. Xáo trộn ngẫu nhiên gán cho mỗi dòng một khóa sắp xếp ngẫu nhiên, tạo ra thứ tự khác nhau mỗi lần chạy. Chuyển đổi giữa các chế độ trên cùng một đầu vào nhanh hơn nhiều so với việc viết một đoạn script riêng.
Tại Sao Dùng Công Cụ Sắp Xếp Dòng Này?
Dán văn bản của bạn, chọn chế độ sắp xếp và nhận kết quả ngay lập tức. Không cần thiết lập dòng lệnh, không cần tệp script, không cần cài đặt gói.
Các Trường Hợp Sử Dụng Công Cụ Sắp Xếp Dòng
Tham Chiếu Các Chế Độ Sắp Xếp Dòng
Công cụ này hỗ trợ sáu chế độ sắp xếp. Bảng dưới đây mô tả từng chế độ, phương pháp so sánh được sử dụng, và ví dụ kết quả cho danh sách đầu vào: apple, banana, cherry, date, fig.
| Chế Độ | Mô Tả | Phương Thức JS | Ví Dụ Đầu Ra |
|---|---|---|---|
| A-Z | Alphabetical ascending | localeCompare() | apple, banana, cherry |
| Z-A | Alphabetical descending | localeCompare() reversed | cherry, banana, apple |
| Length (short) | Shortest line first | a.length - b.length | fig, date, apple, banana |
| Length (long) | Longest line first | b.length - a.length | banana, apple, date, fig |
| Reverse | Flip line order, no reordering | Array.reverse() | Last line becomes first |
| Random | Randomized comparator (biased) | Math.random() - 0.5 | Different every run |
Các Thuật Toán Sắp Xếp Đằng Sau
Khi bạn gọi Array.sort() trong JavaScript, V8 engine (Chrome, Node.js) sử dụng Timsort kể từ năm 2019. Các runtime khác dùng các thuật toán khác nhau. Bảng dưới đây so sánh các thuật toán sắp xếp phổ biến nhất được dùng trong thư viện chuẩn của các ngôn ngữ lập trình. Tất cả đều xử lý khối lượng công việc sắp xếp dòng trong công cụ này trong chưa đầy một mili giây với đầu vào thông thường (dưới 100.000 dòng).
| Thuật Toán | Sử Dụng Bởi | Độ Phức Tạp | Ghi Chú |
|---|---|---|---|
| Timsort | Python, Java (Arrays.sort) | O(n log n) | Stable, fast on partially sorted data |
| Quicksort | C stdlib, V8 (older) | O(n log n) | In-place, unstable by default |
| Merge sort | Most stable-sort implementations | O(n log n) | Stable, predictable, uses extra memory |
| Introsort | C++ std::sort, .NET | O(n log n) | Hybrid: quicksort + heapsort fallback |
| Radix sort | Fixed-length keys, integers | O(nk) | Non-comparative, linear for short keys |
Ví Dụ Code
Sắp xếp dòng theo chương trình trong JavaScript, Python, Go, và dòng lệnh. Mỗi ví dụ bao gồm sắp xếp theo bảng chữ cái, theo độ dài, và sắp xếp ngược.
const text = `banana
apple
cherry
date
fig`
// Sort A-Z (locale-aware)
const az = text.split('\n').sort((a, b) => a.localeCompare(b)).join('\n')
// → "apple\nbanana\ncherry\ndate\nfig"
// Sort by line length, shortest first
const byLen = text.split('\n').sort((a, b) => a.length - b.length).join('\n')
// → "fig\ndate\napple\nbanana\ncherry"
// Reverse line order (no alphabetical sorting)
const reversed = text.split('\n').reverse().join('\n')
// → "fig\ndate\ncherry\napple\nbanana"
// Remove duplicates and sort
const unique = [...new Set(text.split('\n'))].sort().join('\n')text = """banana apple cherry date fig""" lines = text.splitlines() # Sort A-Z (case-insensitive) az = sorted(lines, key=str.lower) # → ['apple', 'banana', 'cherry', 'date', 'fig'] # Sort by line length by_len = sorted(lines, key=len) # → ['fig', 'date', 'apple', 'banana', 'cherry'] # Reverse original order rev = lines[::-1] # → ['fig', 'date', 'cherry', 'apple', 'banana'] # Shuffle randomly import random random.shuffle(lines) # modifies in place
package main
import (
"fmt"
"sort"
"strings"
)
func main() {
text := "banana\napple\ncherry\ndate\nfig"
lines := strings.Split(text, "\n")
// Sort A-Z
sort.Strings(lines)
fmt.Println(strings.Join(lines, "\n"))
// → apple\nbanana\ncherry\ndate\nfig
// Sort by length
sort.Slice(lines, func(i, j int) bool {
return len(lines[i]) < len(lines[j])
})
fmt.Println(strings.Join(lines, "\n"))
// → fig\ndate\napple\nbanana\ncherry
}# Sort lines A-Z
sort file.txt
# Sort lines Z-A (reverse)
sort -r file.txt
# Sort numerically (first field)
sort -n data.txt
# Sort by line length (awk + sort + cut)
awk '{ print length, $0 }' file.txt | sort -n | cut -d' ' -f2-
# Shuffle lines randomly
shuf file.txt # GNU coreutils
sort -R file.txt # alternative (not truly uniform)
# Sort and remove duplicates
sort -u file.txt