বেসিক সোর্টস (Basic Sorts)
কল্পনা করুন আপনাকে কিছু খেলার তাস দেওয়া হয়েছে এবং আপনি সেগুলো ক্রমানুসারে সাজাতে চান। মানুষের স্বভাবজাত পদ্ধতিতে এটি করার তিনটি সাধারণ উপায় রয়েছে:
বিকল্প ক (Option A): বাঁ থেকে ডান দিকে চোখ বুলান, যদি কোনো দুটি পাশাপাশি তাস ঠিক ক্রমানুসারে না থাকে তবে তাদের স্থান অদলবদল বা সোয়াপ (swap) করুন। তাসগুলো পুরোপুরি সাজানো না হওয়া পর্যন্ত এটি পুনরাবৃত্তি করুন। এটিই হলো বাবল সোর্ট (bubble sort)।
বিকল্প খ (Option B): আপনার হাতে থাকা অগোছালো তাসগুলোর মধ্যে সবচেয়ে ছোট মানের তাসটি খুঁজে বের করুন, সেটিকে টান দিয়ে বের করে সাজানো তাসগুলোর সাথে ক্রমানুসারে আলাদা করে রাখুন। এটি পুনরাবৃত্তি করুন। এটিই হলো সিলেকশন সোর্ট (selection sort)।
বিকল্প গ (Option C): একসঙ্গে একটি করে তাস তুলুন এবং ইতিমধ্যে আপনার হাতে থাকা সাজানো তাসগুলোর মধ্যে এটিকে ঠিক সঠিক জায়গায় স্লাইড করে বসিয়ে দিন। এটিই হলো ইনসার্শন সোর্ট (insertion sort)।
সবচেয়ে খারাপ বা ওয়ার্স্ট কেসে (worst case) এই তিনটি পদ্ধতিরই টাইম কমপ্লেক্সিটি (time complexity) হলো \(O(n^2)\)। কিন্তু এদের প্রত্যেকের কাজের ধরন একে অপরের থেকে সম্পূর্ণ আলাদা।
বাবল সোর্ট (Bubble Sort) — প্রতিবেশীকে সোয়াপ করে উপরে ওঠা
বাবল সোর্ট পুরো অ্যারের ওপর দিয়ে পাস (pass) করে বা বারবার ঘোরে, আর পাশাপাশি থাকা জোড়াগুলো যদি ভুল ক্রমানুসারে থাকে, তবে তাদের সোয়াপ বা অদলবদল করে। প্রতিটি পাসের পরে, সবচেয়ে বড় অসাজানো উপাদানটি বুদবুদের মতো বা "বাবল (bubbled)" হয়ে একেবারে শেষের সঠিক স্থানে পৌঁছে যায়। একটি আর্লি-এক্সিট (early-exit) অপ্টিমাইজেশন দিয়ে (যদি কোনো পাসে একবারও সোয়াপ না হয়, তবে কাজ বন্ধ করে দেওয়া), আগে থেকেই সাজানো ইনপুটে এটি \(O(n)\) সময়ে কাজ করে। সবচেয়ে খারাপ ক্ষেত্রে (অর্থাৎ উল্টোভাবে সাজানো থাকলে), এটি \(O(n^2)\) বার সোয়াপ করে। এটি স্টেবল (stable) — সমান মানের উপাদানগুলো কখনোই সোয়াপ হয়ে একে অপরের স্থান পরিবর্তন করে না বা আগে পরে যায় না।
সিলেকশন সোর্ট (Selection Sort) — সবসময় সর্বনিম্ন মানটি খুঁজে নেওয়া
প্রতিটি i পজিশনের জন্য, সিলেকশন সোর্ট বাকি থাকা অসাজানো অংশটুকু স্ক্যান করে সবচেয়ে ছোট বা মিনিমাম (minimum) উপাদানটি খুঁজে বের করে, এবং এরপর সেটিকে i পজিশনের সাথে সোয়াপ করে। ইনপুট যেমনই হোক না কেন, এটি সবসময় ঠিক n(n−1)/2 বার তুলনা বা কম্পেয়ার করে — এতে আগে থেকে বের হয়ে আসার কোনো সুযোগ বা আর্লি-এক্সিট (early exit) নেই। এটি সর্বোচ্চ n−1 বার সোয়াপ করে, যা রাইট (write) অপারেশন ব্যয়বহুল বা মূল্যবান হলে বেশ কাজে দেয়। এটি স্টেবল নয় (not stable): সর্বনিম্ন মানটিকে তার সঠিক জায়গায় সোয়াপ করতে গিয়ে সমান মানের উপাদানগুলোকে ডিঙিয়ে যেতে পারে, ফলে তাদের নিজেদের আগের ক্রম পরিবর্তন হয়ে যেতে পারে।
ইনসার্শন সোর্ট (Insertion Sort) — ঠিক জায়গায় স্লাইড করা
ইনসার্শন সোর্ট বাঁ থেকে ডান দিকে একটি সাজানো সাব-অ্যারে (sorted subarray) তৈরি করে। প্রতিটি নতুন উপাদানের জন্য, এটি সাজানো অংশের উপাদানগুলোকে ডান দিকে সরাতে থাকে যতক্ষণ না ইনসার্ট বা প্রবেশ করানোর সঠিক জায়গাটি খুঁজে পায়। ইনপুটটি যদি প্রায়-সাজানো (nearly-sorted) হয়, তবে খুব অল্প জায়গাই সরাতে হয়: সব মিলিয়ে \(O(n)\)। কিন্তু যদি সব উল্টোভাবে সাজানো থাকে, তবে প্রতিটি উপাদানকেই তার আগের সব উপাদানের চেয়ে পেছনে সরতে হয়: যা \(O(n^2)\)। এটি স্টেবল এবং ইন-প্লেস (stable and in-place)।
ছোট সাইজের অ্যারের (n ≤ 16–32) জন্য ইনসার্শন সোর্টই প্রথম পছন্দের অ্যালগরিদম। পাইথনের টিম-সোর্ট (Timsort) এবং সি++ এর ইন্ট্রো-সোর্টের (Introsort) মতো প্রোডাকশন-লেভেলের সোর্ট ইঞ্জিনগুলো ছোট সাব-অ্যারের জন্য এই ইনসার্শন সোর্টেই ফিরে আসে বা নির্ভর করে, কারণ এর কনস্ট্যান্ট (constant) ফ্যাক্টর খুব ছোট এবং এর ক্যাশ-ফ্রেন্ডলি (cache-friendly) মেমরি অ্যাক্সেস প্যাটার্ন একে সেখানে সবচেয়ে দ্রুতগতির করে তোলে।