সি এবং জাভাতে কুইকসর্ট পদ্ধতি: একটি সম্পূর্ণ নির্দেশিকা

সর্বশেষ আপডেট: 6 মার্চ 2026
  • Quicksort হল একটি দক্ষ বাছাই অ্যালগরিদম যা divide and conquer এর উপর ভিত্তি করে তৈরি, যার গড় পারফরম্যান্স O(n log n) এবং সবচেয়ে খারাপ ক্ষেত্রে O(n^2)।
  • একটি পিভট নির্বাচন করুন এবং পুনরাবৃত্তি অনুসারে ছোট এবং বড় উপাদানগুলিকে ভাগ করুন; পিভটের পছন্দ কর্মক্ষমতাকে প্রভাবিত করে।
  • সি এবং জাভাতে বাস্তবায়নযোগ্য; পুনরাবৃত্তিমূলক সংস্করণ বিদ্যমান, এটি স্থিতিশীল নয় এবং বারবার ব্যবহার করলে এর কার্যকারিতা হ্রাস পেতে পারে।
দ্রুত সাজানোর পদ্ধতি

প্রোগ্রামিংয়ের জগতে সর্টিং অ্যালগরিদম একটি মৌলিক ভূমিকা পালন করে। সবচেয়ে কার্যকর এবং বহুল ব্যবহৃত অ্যালগরিদমগুলোর মধ্যে কুইকসর্ট অন্যতম। উপাদান বাছাইয়ের ক্ষেত্রে এর গতি ও দক্ষতার জন্য পরিচিত এই অ্যালগরিদমটি সি এবং জাভাসহ বিভিন্ন প্রোগ্রামিং ভাষায় প্রয়োগ করা যায়। এই বিশদ নির্দেশিকায়, আমরা সি এবং জাভাতে কুইকসর্টের কার্যপ্রণালী, প্রয়োগ এবং মূল বৈশিষ্ট্যগুলো বিশ্লেষণ করে এটি নিয়ে বিস্তারিত আলোচনা করব। কুইকসর্ট অ্যালগরিদমের এই আকর্ষণীয় যাত্রায় আমাদের সাথে যোগ দিন এবং আবিষ্কার করুন কীভাবে আপনি আপনার নিজের প্রোগ্রামিং প্রকল্পে এটি প্রয়োগ করতে পারেন।

কুইকসর্ট পদ্ধতি কী?

কুইকসর্ট, যা কুইকসর্ট নামেও পরিচিত, হলো একটি দক্ষ সর্টিং অ্যালগরিদম যা ডিভাইড-অ্যান্ড-কনকার কৌশল ব্যবহার করে। এটি ১৯৫৯ সালে ব্রিটিশ কম্পিউটার বিজ্ঞানী স্যার টনি হোয়ার তৈরি করেন এবং তখন থেকে এটি প্রোগ্রামিং-এ সবচেয়ে বেশি ব্যবহৃত ও আলোচিত সর্টিং অ্যালগরিদমগুলোর মধ্যে অন্যতম হয়ে উঠেছে।

কুইকসর্ট অ্যালগরিদমটি এই নীতির উপর ভিত্তি করে কাজ করে যে, সাজানোর জন্য নির্ধারিত তালিকা থেকে একটি পিভট উপাদান নির্বাচন করা হয় এবং অবশিষ্ট উপাদানগুলোকে দুটি দলে বিভক্ত করা হয়: যেগুলো পিভটের চেয়ে ছোট বা সমান, এবং যেগুলো পিভটের চেয়ে বড়। এরপর, এই দুটি দলের প্রতিটির উপর একই প্রক্রিয়াটি পুনরাবৃত্তিমূলকভাবে প্রয়োগ করা হয়, যতক্ষণ না সমস্ত উপাদান সাজানো হয়ে যায়।

সি-তে কুইকসর্ট পদ্ধতি

এর কার্যকারিতা এবং হার্ডওয়্যারের উপর নিম্ন-স্তরের নিয়ন্ত্রণের কারণে অ্যালগরিদম বাস্তবায়নের জন্য সি প্রোগ্রামিং ভাষা ব্যাপকভাবে ব্যবহৃত হয়। নিচে, আমরা সি-তে কুইকসর্ট পদ্ধতির একটি ধাপে ধাপে বাস্তবায়ন উপস্থাপন করব:

ধাপ ১: পিভট নির্বাচন করা

প্রথমে, তালিকা থেকে একটি পিভট আইটেম নির্বাচন করতে হবে। পিভট নির্বাচন করার বিভিন্ন পদ্ধতি রয়েছে, তবে একটি সাধারণ পদ্ধতি হল তালিকার প্রথম আইটেমটি নির্বাচন করা।

ধাপ ২: পার্টিশন করা

একবার পিভট নির্বাচন করা হলে, তালিকাটিকে দুটি গ্রুপে ভাগ করতে হবে: পিভটের চেয়ে ছোট বা সমান উপাদান এবং পিভটের চেয়ে বড় উপাদান। এটি সম্পন্ন করার জন্য, একটি বাম পয়েন্টার এবং একটি ডান পয়েন্টার ব্যবহার করে তালিকার কেন্দ্রের দিকে সরানো হয় যতক্ষণ না তারা এমন উপাদান খুঁজে পায় যা অদলবদল করা প্রয়োজন।

  FIFO অ্যালগরিদম: একটি ঐতিহাসিক চেহারা এবং এর বিবর্তন

ধাপ ৩: পুনরাবৃত্তি

পার্টিশন করার পর, একই প্রক্রিয়াটি দুটি উৎপন্ন গ্রুপের প্রতিটিতে পুনরাবৃত্তভাবে প্রয়োগ করা হয়। অর্থাৎ, প্রতিটি গ্রুপে একটি নতুন পিভট নির্বাচন করা হয় এবং সমস্ত উপাদান সাজানো না হওয়া পর্যন্ত পার্টিশন পুনরায় সঞ্চালিত হয়।

ধাপ ৪: সমন্বয়

অবশেষে, দলগুলিকে একটি একক সুবিন্যস্ত বিন্যাসে একত্রিত করা হয়। এই বিন্দুতে, পিভটের চেয়ে ছোট বা সমান সমস্ত উপাদান এর বাম দিকে থাকবে, এবং এর চেয়ে বড় সমস্ত উপাদান এর ডানদিকে থাকবে।

নিচে C তে Quicksort পদ্ধতির বাস্তবায়নের একটি উদাহরণ দেওয়া হল:

#include <stdio.h>

void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int partition(int arr[], int low, int high) {
    int pivot = arr[low];
    int i = low + 1;
    int j = high;

    while (1) {
        while (arr[i] < pivot && i <= j)
            i++;

        while (arr[j] > pivot)
            j--;

        if (i >= j)
            break;

        swap(&arr[i], &arr[j]);
    }

    swap(&arr[low], &arr[j]);

    return j;
}

void quicksort(int arr[], int low, int high) {
    if (low < high) {
        int pivot = partition(arr, low, high);
        quicksort(arr, low, pivot - 1);
        quicksort(arr, pivot + 1, high);
    }
}

int main() {
    int arr[] = {5, 2, 9, 1, 7, 6, 8, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    quicksort(arr, 0, n - 1);

    printf("Arreglo ordenado: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

এই কোডটি রিকার্সন কৌশল ব্যবহার করে C তে Quicksort পদ্ধতি প্রয়োগ করে। যখন আপনি প্রোগ্রামটি চালাবেন, তখন ইনপুট অ্যারে সাজানো হবে এবং ফলাফল প্রিন্ট হবে।

জাভাতে কুইকসর্ট পদ্ধতি

জাভা আরেকটি বহুল ব্যবহৃত প্রোগ্রামিং ভাষা যা কুইকসর্ট পদ্ধতি দক্ষতার সাথে বাস্তবায়নের জন্যও উপযুক্ত। এরপর, আমরা জাভাতে Quicksort পদ্ধতির ধাপে ধাপে বাস্তবায়ন দেখাবো:

ধাপ ১: পিভট নির্বাচন করা

ঠিক যেমন C বাস্তবায়নে, জাভাতেও আমাদের তালিকা থেকে একটি পিভট উপাদান নির্বাচন করতে হবে। আমরা প্রথম উপাদান, শেষ উপাদান অথবা এমনকি একটি এলোমেলো উপাদানকে পিভট হিসেবে বেছে নিতে পারি।

ধাপ ২: পার্টিশন করা

একবার পিভট নির্বাচন করা হয়ে গেলে, তালিকাটিকে দুটি গ্রুপে ভাগ করতে হবে, ঠিক যেমন C বাস্তবায়নে ছিল। আমরা দুটি সূচক ব্যবহার করব, একটি তালিকার শুরু থেকে শুরু করে এবং একটি শেষে, এবং সেগুলিকে কেন্দ্রের দিকে নিয়ে যাব যতক্ষণ না তারা এমন উপাদান খুঁজে পায় যা অদলবদল করা প্রয়োজন।

  শক্তিশালী র‍্যাডিক্স বাছাই অ্যালগরিদম

ধাপ ৩: পুনরাবৃত্তি

পার্টিশন করার পর, একই প্রক্রিয়াটি দুটি উৎপন্ন গ্রুপের প্রতিটিতে পুনরাবৃত্তভাবে প্রয়োগ করা হয়। সমস্ত উপাদান সাজানো না হওয়া পর্যন্ত প্রতিটি গ্রুপের জন্য আবার Quicksort পদ্ধতি কল করে এটি সম্পন্ন করা হয়।

ধাপ ৪: সমন্বয়

অবশেষে, গ্রুপগুলিকে একটি একক সাজানো অ্যারেতে একত্রিত করা হয়, ঠিক যেমন C বাস্তবায়নে করা হয়েছিল।

জাভাতে Quicksort পদ্ধতির বাস্তবায়নের একটি উদাহরণ নিচে দেওয়া হল:

public class Quicksort {
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static int partition(int[] arr, int low, int high) {
        int pivot = arr[low];
        int i = low + 1;
        int j = high;

        while (true) {
            while (i <= j && arr[i] < pivot)
                i++;

            while (arr[j] > pivot)
                j--;

            if (i >= j)
                break;

            swap(arr, i, j);
        }

        swap(arr, low, j);

        return j;
    }

    public static void quicksort(int[] arr, int low, int high) {
        if (low < high) {
            int pivot = partition(arr, low, high);
            quicksort(arr, low, pivot - 1);
            quicksort(arr, pivot + 1, high);
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 9, 1, 7, 6, 8, 3, 4};
        int n = arr.length;

        quicksort(arr, 0, n - 1);

        System.out.print("Arreglo ordenado: ");
        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

C বাস্তবায়নের মতো, এই কোডটি জাভাতে রিকার্সন ব্যবহার করে Quicksort পদ্ধতি প্রয়োগ করে। যখন আপনি প্রোগ্রামটি চালাবেন, তখন ইনপুট অ্যারে সাজানো হবে এবং ফলাফল প্রিন্ট হবে।

প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী

১. কুইকসর্ট পদ্ধতির জটিলতা কী? কুইকসর্ট পদ্ধতির গড় জটিলতা সাধারণ ক্ষেত্রে O(n log n) এবং সবচেয়ে খারাপ ক্ষেত্রে O(n^2), যেখানে "n" হলো যে অ্যারেটি সর্ট করতে হবে তার আকার। তবে, এর দক্ষতা এবং বেশিরভাগ ক্ষেত্রে ভালো পারফরম্যান্সের কারণে কুইকসর্ট ব্যাপকভাবে ব্যবহৃত হয়।

২. কুইকসর্ট পদ্ধতিতে আমি কীভাবে সেরা পিভট নির্বাচন করব? পিভটের নির্বাচন অ্যালগরিদমের পারফরম্যান্সকে প্রভাবিত করতে পারে। একটি সাধারণ কৌশল হলো অ্যারের মাঝের উপাদানটিকে পিভট হিসেবে নির্বাচন করা, যাতে উপাদানগুলো আরও সমানভাবে বণ্টিত হয়। আরেকটি বিকল্প হলো তিনটি উপাদান নির্বাচন করে তাদের মধ্যককে পিভট হিসেবে ব্যবহার করা।

৩. অন্যান্য সর্টিং অ্যালগরিদমের পরিবর্তে কখন কুইকসর্ট ব্যবহার করা উচিত? যখন আপনি একটি কার্যকর সর্টিং অ্যালগরিদম চান এবং আপনার কাছে পর্যাপ্ত মেমরি উপলব্ধ থাকে, তখন কুইকসর্ট একটি চমৎকার পছন্দ। তবে, যদি মেমরি সীমিত থাকে অথবা আপনার একটি স্থিতিশীল অ্যালগরিদম (যা অভিন্ন উপাদানগুলোর আপেক্ষিক ক্রম বজায় রাখে) প্রয়োজন হয়, তাহলে আপনি মার্জসর্টের মতো অন্যান্য অ্যালগরিদম বিবেচনা করতে পারেন ।

  মোসকার উপপাদ্য এবং কোয়ান্টাম কম্পিউটিংয়ের আগমন

৪. যে অ্যারেটি সর্ট করতে হবে তাতে যদি পুনরাবৃত্ত উপাদান থাকে তাহলে কী হবে? কুইকসর্ট পদ্ধতি কোনো সমস্যা ছাড়াই পুনরাবৃত্ত উপাদানযুক্ত অ্যারে পরিচালনা করতে পারে। তবে, সবচেয়ে খারাপ পরিস্থিতিতে, যখন সমস্ত উপাদান একই হয়, তখন বিভাজনটি ন্যায্য নাও হতে পারে এবং এটি অ্যালগরিদমের কর্মক্ষমতাকে প্রভাবিত করতে পারে।

৫. রিকার্সিভ পদ্ধতির পরিবর্তে ইটারেটিভ পদ্ধতিতে কুইকসর্ট মেথডটি প্রয়োগ করা কি সম্ভব? হ্যাঁ, স্ট্যাক নামক একটি ডেটা স্ট্রাকচার ব্যবহার করে ইটারেটিভ পদ্ধতিতে কুইকসর্ট মেথডটি প্রয়োগ করা সম্ভব। রিকার্সিভ সংস্করণটিই বেশি প্রচলিত, কিন্তু কিছু নির্দিষ্ট ক্ষেত্রে যেখানে আপনি রিকার্সনের অতিরিক্ত বোঝা এড়াতে চান, সেখানে ইটারেটিভ সংস্করণটিই বেশি সুবিধাজনক হতে পারে।

৬. কুইকসর্ট পদ্ধতি কি স্থিতিশীল? না, কুইকসর্ট পদ্ধতি স্থিতিশীল নয়, অর্থাৎ এটি অভিন্ন উপাদানগুলোর আপেক্ষিক ক্রমকে আবশ্যিকভাবে সংরক্ষণ করে না। যদি একটি স্থিতিশীল অ্যালগরিদমের প্রয়োজন হয়, তবে মার্জসর্টের মতো অন্যান্য বিকল্প বিবেচনা করা উচিত।

উপসংহার

পরিশেষে, কুইকসর্ট প্রোগ্রামিং-এ একটি দক্ষ এবং বহুল ব্যবহৃত সর্টিং অ্যালগরিদম । এই নির্দেশিকা জুড়ে, আমরা বিস্তারিতভাবে আলোচনা করেছি এটি কীভাবে কাজ করে এবং C ও Java প্রোগ্রামিং ভাষায় কীভাবে এটি প্রয়োগ করা যায়। কুইকসর্ট ‘ডিভাইড-অ্যান্ড-কনকার’ কৌশল ব্যবহার করে, যেখানে একটি পিভট নির্বাচন করে অবশিষ্ট উপাদানগুলোকে দুটি দলে বিভক্ত করা হয়। রিকারশনের মাধ্যমে, চূড়ান্ত সর্টেড অ্যারেটি না পাওয়া পর্যন্ত দলগুলোকে সর্ট করা হয়।

কুইকসর্টের বৈশিষ্ট্য এবং বিবেচনাগুলি লক্ষ্য করা গুরুত্বপূর্ণ, যেমন পিভট নির্বাচন এবং পুনরাবৃত্ত উপাদানগুলির পরিচালনা। অতিরিক্তভাবে, প্রকল্পের নির্দিষ্ট চাহিদার উপর ভিত্তি করে অন্যান্য বাছাই অ্যালগরিদম বিকল্পগুলি মূল্যায়ন করা উচিত।

আমরা আশা করি সি এবং জাভাতে কুইকসর্ট পদ্ধতির এই বিস্তৃত নির্দেশিকাটি আপনাকে একটি দৃঢ় ধারণা দিয়েছে এবং আপনার নিজস্ব প্রোগ্রামিং প্রকল্পগুলিতে এই দক্ষ অ্যালগরিদম প্রয়োগ করতে অনুপ্রাণিত করেছে!