একটি অ্যালগরিদম একটি র্যান্ডমাইজড পাইভট ব্যবহার করে বেশিরভাগ খারাপ কেস থেকে পালিয়ে যায়, অবিচ্ছিন্ন উপাদানগুলি বিভাজন থেকে অবিচ্ছিন্ন সমান উপাদান বাদ দেয়। এটি একটি উপাদানকে বৃহত্তর ফরোয়ার্ড করে বা একটি পিভটের সমান করে এবং পিভটের চেয়ে কম উপাদানকে পিছনে সন্ধান করে ।
আমি মাইকেলটিকে ধন্যবাদ জানাই, [2,1,2,1,2,1,2,1] সমাধানের জন্য অসম অনুসন্ধান অনুসন্ধান করা হয়েছে।
নিম্নলিখিত ফলাফলটি আমার ফাংশন qsort_random () দ্বারা উত্পাদিত হয়েছে। এন = 100,000
usec call compare copy pattern
80132 62946 1971278 877143 random
47326 57578 1606067 215155 sorted : 0,1,2,3,...,n-1
49927 63578 1628883 338715 sorted in reverse : n-1,n-2,...,2,1,0
55619 63781 1596934 377330 nearly reverse : n-2,n-1,n-4,n-3,...,2,3,0,1
54714 66667 1611454 290392 median-3-killer : n-1,0,1,2,...,n-2
1491 1 99999 4 all values the same : n,n,n,...
1577 1 99999 4 first is higher : n,1,1,1,...
2778 2 156159 10 last is lower : n,n,n,...,n,1
2994 3 199996 100009 a few data : n,...,n,1,...,1
3196 3 199996 50012 zigzag : n,1,n,1,...,n,1
917796 56284 67721985 673356 valley(sawtooth?) : n-1,n-3,...,0,...,n-4,n-2
বেশিরভাগ ক্ষেত্রে একটি এলোমেলো নিদর্শন চেয়ে দ্রুত। বেশিরভাগ পিভট নির্বাচনের জন্য ভ্যালি প্যাটার্ন একটি খারাপ কেস।
qsort(3) usec = 14523 call = 0 compare = 884463 copy = 0
qsort_head() usec = 138609 call = 99999 compare = 8120991 copy = 1214397
qsort_middle() usec = 664325 call = 99999 compare = 52928111 copy = 1036047
qsort_trad() usec = 118122 call = 99999 compare = 6476025 copy = 1337523
qsort_random() usec = 295699 call = 58806 compare = 19439952 copy = 732962
qsort_log2() usec = 66411 call = 63987 compare = 1597455 copy = 944821
qsort_log2 () লগ 2 (এন) উপাদানগুলিতে একটি পিভট নির্বাচন করে খারাপ কেস থেকে পালিয়ে যায়।
qsort (3) GNU লাইব্রেরি ব্যবহার করুন যা সূচীকরণের একীভূত সাজান।
qsort_trad () প্রথম, মধ্য এবং শেষ উপাদানগুলিতে একটি পাইভট নির্বাচন করুন।
qsort_random () এবং qsort_log2 () অদলবদল ব্যবহার করবেন না।
সোর্স সি প্রোগ্রাম এবং স্ক্রিপ্টগুলি গিথুবে পোস্ট করা হয় ।