پیاده سازی Radix-Sort - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

پیاده سازی Radix-Sort

0 امتیاز

در مورد این الگوریتم می تونید اینجا رو مطالعه کنید برای نمونه مثلا اگر بخواهیم 3 عدد 123و101و110 رو مرتب کنیم الگوریتم ابتدا از رقم یکان و دهگان و سپس صدگان عناصر رو مرتب می کنه

counting_sort رو با vector پیاده کردم اما ایده ای برای مرتب کردن مبنایی ندارم؟! 

(مثلا بیام هر عدد داخل vector رو به mod 10 بگیرم و بفرستم به counting_sort و اون این اعداد رو مرتب کنه و یک آرایه کمکی برای نگهداری اندیس های مرتب شده ، مشکل اینجاست که چطور باید ارتباط مثلا رقم یکان مرتب شده رو با اندیس اولیه اون عدد برقرار کنم)

سوال شده خرداد 8, 1393  بوسیله ی Pakniat (امتیاز 247)   9 21 32

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

راه که زیاده

مثلا میشه یک کلاس برای ذخیره اعداد نوشت به این شکل که باهاش بشه به تعداد رقم های هر عدد و رقم ها بصورت جدا جدا دسترسی داشت .

#include <iostream>
#include <vector>
#include <algorithm>
class Int
{
public:
    Int(int number):number_(number)
    {
        while(number >0)
        {
            digits.push_back(number%10);
            number /=10;
        }
    }

    int operator[](int index)const
    {
        return digits[index];
    }

    int size() const
    {
        return digits.size();
    }
    int operator()()const
    {
        return number_;
    }

private:
    int number_;
    std::vector<int> digits;
};

int main()
{
    Int myNumber(19);
    std::cout<<myNumber.size()<<"\n";//tedad ragham ha;
    std::cout<<myNumber[0]<<"\n" ;//ragham 0 ro neshoon mide yani 9;
    std::cout<<myNumber();//khode adad ro neshoon mide : 19
}

بعد ورودی که میگیری بصورت شی این کلاس ذخیره کنی و با یکم عوض کردن counting sort اعداد رو مرتب کنی

مثلا توی کد زیر با کامل کردن  counting sort الگوریتم کامل میشه :

#include <iostream>
#include <vector>
#include <algorithm>
class Int
{
public:
    Int(int number):number_(number)
    {
        while(number >0)
        {
            digits.push_back(number%10);
            number /=10;
        }
    }

    int operator[](int index)const
    {
        return digits[index];
    }

    int size() const
    {
        return digits.size();
    }
    int operator()()const
    {
        return number_;
    }

private:
    int number_;
    std::vector<int> digits;
};

void countingSort(std::vector<Int>& numbers,int sort_digit)
{
    //do counting sort ( sotoon sort_digit bayad moratab beshe )
}
void radix_sort(std::vector<Int>& numbers)
{
    Int BiggestInt=*(std::max_element(numbers.begin(),numbers.end(),[](const Int& a,const Int& b){
        return a.size()<b.size() ;
    }));
    int max_size = BiggestInt.size();

    for(int i=0;i<max_size;i++)
        countingSort(numbers,i);
}

int main()
{
    std::vector<Int> numbers;
    for(int i=0;i<10;i++)
    {
        int n;
        std::cin>>n;
        numbers.push_back(Int(n));
    }
    radix_sort(numbers);
}

 

 

پاسخ داده شده خرداد 8, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد خرداد 8, 1393 بوسیله ی Pakniat
کلاسی که گفتید رو ساختم اما هنوز نمی دونم چطوری مثلا digit 0  بعد 1و.. رو مرتب کنم و شی ها رو به هم ربط بدم ، مثلا 12و13
...