কুইকসর্ট একটি সর্টিং কৌশল যা একটি অসর্টেড লিস্ট (অ্যারে) সর্ট করার জন্য তুলনা ব্যবহার করে। কুইকসর্টকে পার্টিশান এক্সচেঞ্জ সর্টও বলা হয়।
এটি একটি স্থিতিশীল সর্ট নয়, কারণ সমান সর্ট আইটেমের النسبিক ক্রম সংরক্ষিত থাকে না। কুইকসর্ট একটি অ্যারে ওপর কাজ করতে পারে, সর্টিং সম্পাদনের জন্য ছোট অতিরিক্ত মেমরি প্রয়োজন। এটি সিলেকশন সর্টের মতো অনেক, ngoại trừ এটি সবসময় ওয়ার্স্ট-কেস পার্টিশান বেছে নেয় না। তাই আমরা এটি সিলেকশন সর্টের একটি উন্নত রূপ বলতে পারি।
কুইকসর্ট সবচেয়ে দক্ষ সর্টিং অ্যালগরিদমের একটি এবং এটি একটি অ্যারেকে ছোট ছোট অংশে ভাগ করার উপর ভিত্তি করে। নামটি এসে কারণ কুইকসর্ট সাধারণ সর্টিং অ্যালগরিদমের চেয়ে ডেটা এলিমেন্টের লিস্ট উল্লেখযোগ্যভাবে দ্রুত সর্ট করতে পারে। এবং মার্জ সর্টের মতো, কুইক সর্টও সমস্যা সমাধানের ডিভাইড অ্যান্ড কনকর পদ্ধতির катগরিতে পড়ে।
কুইকসর্ট অ্যালগরিদম নিম্নলিখিতভাবে কাজ করে
অ্যানালজিক্যাল ভিউ থেকে বিবেচনা করলে, একটি পরিস্থিতি বিবেচনা করুন যেখানে ছাত্রদের নাম্বের কাগজপত্র নাম অনুযায়ী সর্ট করতে হয়। নিচের পদ্ধতি ব্যবহার করা যেতে পারে:
একটি স্প্লিটিং ভ্যালু নির্বাচন করুন, যেমন L। স্প্লিটিং ভ্যালুকে পিভট (Pivot)ও বলা হয়।
কাগজপত্রের স্ট্যাকটিকে দুটি ভাগে ভাগ করুন: A-L এবং M-Z। পাইলগুলো সমান হওয়া প্রয়োজন নেই।
A-L পাইল এবং M-Z পাইল کے জন্য উপরের দুটি ধাপ পুনরাবৃত্তি করুন, সেগুলো তাদের উল্লেখযোগ্য দুটি হাফে ভাগ করুন। প্রক্রিয়াটি तब तक চালিয়ে যেতে থাকবে যতক্ষণ না পাইলগুলো সহজে সর্ট করার পর্যাপ্ত ছোট হয়।
শেষে, ছোট পাইলগুলো একে অপরের ওপর রাখে পুরোপুরি সর্টেড এবং ক্রমবদ্ধ কাগজপত্রের সেট তৈরি করা যায়।
এখানে ব্যবহৃত পদ্ধতি হলো রিকার্শন (recursion) প্রতিটি স্প্লিটে সিঙ্গেল-এলিমেন্ট অ্যারে পেতে।
প্রতিটি স্প্লিটে, পাইলটি ভাগ করা হয়েছিল এবং তারপর একই পদ্ধতি ছোট পাইলগুলোর জন্য ব্যবহার করা হতো।
এই বৈশিষ্ট্যগুলোর কারণে, কুইকসর্টকে পার্টিশান এক্সচেঞ্জ সর্টও বলা হয়।
ইনপুট: arr[] = {7,4,2,6,3,1,5} আউটপুট: 1 2 3 4 5 6 7
ব্যাখ্যা

একটি উদাহরণ কনসেপ্ট বোঝার জন্য সহায়ক হতে পারে। নিচের অ্যারেটি বিবেচনা করুন: 50, 23, 9, 18, 61, 32
স্টেপ ১ - লিস্ট থেকে যেকোনো মান পিভট হিসেবে সিদ্ধান্ত নিন (সাধারণত শেষ মান)। দুটি মান "Low" এবং "High" এর জন্য যা প্রথম ইনডেক্স এবং শেষ ইনডেক্সের সাথে সম্পর্কিত। আমাদের কেসে low 0 এবং high 5। Low এবং high-এ মান যথাক্রমে 50 এবং 32 এবং পিভটের মান 32।
অतः পার্টিশনিং এর জন্য কল করুন, অ্যারেকে এভাবে রিঅ্যারেঞ্জ করুন যাতে পিভট (32) তার thực tế পজিশনে আসে। এবং পিভটের বাম পাশে অ্যারেতে এর চেয়ে ছোট সব উপাদান থাকে, এবং ডান পাশে এর চেয়ে বড় সব উপাদান থাকে।
পার্টিশন ফাংশনে, আমরা প্রথম এলিমেন্ট থেকে শুরু করি এবং পিভটের সাথে তুলনা করি। যেহেতু 50, 32-র চেয়ে বড়, আমরা কোনো পরিবর্তন না করে পরবর্তী এলিমেন্ট 23-এ যাই।
আবার পিভটের সাথে তুলনা করুন। যেহেতু 23, 32-র চেয়ে ছোট, 50 এবং 23 সোয়াপ করুন। অ্যারে হয় 23, 50, 9, 18, 61, 32।
পরবর্তী এলিমেন্ট 9-এ যান যা আবার পিভট (32) থেকে ছোট, তাই 50-এর সাথে সোয়াপ করলে আমাদের অ্যারে হয়: 23, 9, 50, 18, 61, 32।
সদৃশভাবে, পরবর্তী এলিমেন্ট 18 যা 32-র চেয়ে ছোট, অ্যারে হয়: 23, 9, 18, 50, 61, 32। এখন 61 পিভট (32) থেকে বড়, তাই কোনো পরিবর্তন নেই।
শেষে, আমরা আমাদের পিভটকে 50-এর সাথে সোয়াপ করি যাতে এটি সঠিক পজিশনে আসে।
এভাবে পিভট (32) তার আসল পজিশনে আসে এবং এর বাম পাশের সব উপাদান ছোট, ডান পাশের সব উপাদান বড়।
স্টেপ ২ - প্রথম স্টেপের পর অ্যারে হয়: 23, 9, 18, 32, 61, 50, 32 কে পিভট নিয়ে।
স্টেপ ৩ - এখন লিস্ট দুটি অংশে ভাগ হয়েছে: ১. পিভটের আগের সাবলিস্ট: 23, 9, 18 ২. পিভটের পরের সাবলিস্ট: 61, 50
স্টেপ ৪ - এই সাবলিস্টগুলো için ধাপগুলো পুনরাবৃত্তি করুন।
ফাইনাল অ্যারে হয়: 9, 18, 23, 32, 50, 61।
উদাহরণ
#include <stdio.h>
void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int Partition(int a[], int low, int high) {
int pivot, index, i;
index = low;
pivot = high;
for(i = low; i < high; i++) {
if(a[i] < a[pivot]) {
swap(&a[i], &a[index]);
index++;
}
}
swap(&a[pivot], &a[index]);
return index;
}
int RandomPivotPartition(int a[], int low, int high) {
int pvt, n, temp;
n = rand();
pvt = low + n%(high-low+1);
swap(&a[high], &a[pvt]);
return Partition(a, low, high);
}
int QuickSort(int a[], int low, int high) {
return 0;
}
int main() {
int n, i;
n = 7;
int arr[] = {7, 4, 2, 6, 3, 1, 5};
int high = n - 1;
int low = 0;
int pindex;
if(low < high) {
pindex = RandomPivotPartition(arr, low, high);
QuickSort(arr, low, pindex - 1);
QuickSort(arr, pindex + 1, high);
}
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}