فارز الأسطر
رتب الأسطر أبجديًا أو حسب الطول أو بالعكس أو عشوائيًا
أسطر الإدخال
الأسطر المرتبة
ما هو ترتيب الأسطر؟
ترتيب الأسطر هو عملية إعادة تنظيم أسطر كتلة نصية وفق قاعدة محددة: الترتيب الأبجدي، أو الترتيب العكسي، أو الترتيب حسب طول السطر، أو الترتيب العشوائي. يُعدّ ترتيب الأسطر عبر الإنترنت مهمة شائعة عند التعامل مع ملفات السجلات، وبيانات CSV، وقوائم الإعدادات، أو أي محتوى نصي عادي يكون فيه الترتيب مهمًا. تعمل هذه العملية على تقسيم النص عند محارف السطر الجديد، ثم تطبيق دالة مقارنة على المصفوفة الناتجة، وأخيرًا دمج الأسطر المرتبة مجددًا.
تستخدم معظم لغات البرمجة المقارنة المعجمية (lexicographic) افتراضيًا لترتيب النصوص، إذ تقارن المحارف وفق نقاط شفرة Unicode الخاصة بها. يعني ذلك أن الحروف الكبيرة تُرتَّب قبل الحروف الصغيرة ("Banana" قبل "apple")، وأن الأرقام تأتي قبل الحروف. يُصحح الترتيب المراعي للغة المحلية — المعروف أحيانًا بالترتيب الطبيعي أو التجميع — هذا السلوك عبر تطبيق قواعد خاصة بكل لغة. توفر كلٌّ من الدالة localeCompare() في JavaScript، وlocale.strxfrm() في Python، وأمر sort في POSIX مع LC_COLLATE ترتيبًا مراعيًا للغة المحلية.
يفيد الترتيب حسب الطول حين تحتاج إلى إيجاد أقصر المدخلات أو أطولها في قائمة، أو الكشف عن القيم الشاذة في مخرجات السجلات، أو تنظيم العناصر حسب تعقيدها. أما الترتيب العكسي فيقلب ترتيب الأسطر الحالي دون إعادة ترتيبها أبجديًا، وهو يختلف عن الترتيب الأبجدي من ي إلى أ. وتُعطي عملية الخلط العشوائي كلَّ سطر مفتاح ترتيب عشوائيًا، مما ينتج ترتيبًا مختلفًا في كل مرة. التبديل بين الأوضاع على نفس المدخل أسرع بكثير من كتابة برنامج نصي لكل حالة.
لماذا تستخدم هذا الفارز؟
الصق النص، واختر وضع الترتيب، واحصل على النتيجة فورًا. لا إعداد لسطر الأوامر، ولا ملفات برمجية، ولا تثبيت لحزم.
حالات استخدام فارز الأسطر
مرجع أوضاع ترتيب الأسطر
تدعم هذه الأداة ستة أوضاع للترتيب. يصف الجدول أدناه كل وضع، وطريقة المقارنة التي يستخدمها، ونموذج نتيجة للقائمة: apple، banana، cherry، date، fig.
| الوضع | الوصف | الدالة في JS | مثال على المخرج |
|---|---|---|---|
| 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 |
خوارزميات الترتيب خلف الكواليس
عند استدعاء Array.sort() في JavaScript، يستخدم محرك V8 (Chrome، Node.js) خوارزمية Timsort منذ عام 2019. تستخدم بيئات التشغيل الأخرى خوارزميات مختلفة. يقارن الجدول أدناه أكثر خوارزميات الترتيب شيوعًا المستخدمة في المكتبات القياسية للغات البرمجة. تُعالج جميعها عمليات ترتيب الأسطر في هذه الأداة في أقل من ميلي ثانية للمدخلات المعتادة (أقل من 100,000 سطر).
| الخوارزمية | مستخدمة في | التعقيد الزمني | ملاحظات |
|---|---|---|---|
| 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 |
أمثلة برمجية
رتب الأسطر برمجيًا باستخدام JavaScript، وPython، وGo، وسطر الأوامر. يتناول كل مثال الترتيب الأبجدي، والترتيب حسب الطول، والترتيب العكسي.
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