PDA

View Full Version : مرتب سازی یک سری عدد



میلاد قاضی پور
پنج شنبه 09 اردیبهشت 1389, 20:02 عصر
سلام . من قصد دارم برنامه ای بنویسم که یه سری عدد رو به صورت صعودی یا نزولی مرتب کنه . در مورد الگوریتمش یه ذره ضعف دارم . دوست ندارم کسی الگوریتمشو کامل بنویسه اینجا ولی کمی راهنمایی نیاز دارم تا مراحل کار رو درک کنم . تعداد اعداد بر فرض 10 تا باشه

Pooria121
پنج شنبه 09 اردیبهشت 1389, 20:29 عصر
این مدل از الگوریتم ها، به نام Sorting Algorithm معروف هستند. تعدادی زیادی از اینها وجود داره، و نسبت به تعداد لیست که میخواهید مرتب بشود بستگی دارد. به عنوان مثال 10 تا عدد به هیچ عنوان زیاد نیست که مهم باشه با چه الگلوریتمی انجام بشه، ولی به عنوان مثال 100 تا عدد یا 1000 تا یا ..... زمان زیادی میگیرد اگر درست انتخاب نکنید.
اگر سریع، ساده و کلی بخواهم بگم (ولی شما خودتون باید مطالعه کنید، چون یک مبحص خیلی گسترده ای است)، این مدل الگوریتم ها به تعداد حرکت هاییی که انجام میدهند، تا یک لیست n تایی رو sort کنند، دسته بندی میشوند، به عنوان مثال، یک مدل از sort ها ؛ selection sort است، که به عنوان مثال در بدترین حالت، برای مرتب کردن یک لیست n تایی، n^2 حرکت انجام میدهد (البته، گفتن "حرکت" غلط است، ولی برای سادگی و فهم مطلب عرض میکنم) ، همانطوری که میبنی، زمانی که تعداد عداد شما در یک لیست زیاد میشه، تعداد حرکت ها، بصورت توانی (Exponentially) زیاد میشه، ولی برای یک لیست کوچک خیلی مناسبه. تعداد زیادی از اینها هستند، ولی به نظر من راحترین برای شروع، selection sort است و شمارو آماده برای یادگیری مباحث Algorithm میکنه، برای چگونگی کار این به لینک زیر مراجعه کنید.
http://en.wikipedia.org/wiki/Selection_sort

میلاد قاضی پور
پنج شنبه 09 اردیبهشت 1389, 20:46 عصر
با تشکر از شما باید بگم مباحث مطرح شده در اون صفحه ویکی پدیا بسیار بسیط و کشـــــ دار بودن . من فقط یه راهنمایی کوچیک نیاز دارم تا یه جرقه ای به این مخ ناکار ما بخوره .

Pooria121
پنج شنبه 09 اردیبهشت 1389, 21:00 عصر
من Selection sort رو بصورت اجمالی اینجا توضیح میدم تا مغر شما اون جرقه رو بگیره...
شما فرظ کنید که یک لیست عدد داریند...

5 - 4 - 7 - 1 - 23 - 6


ما در یک حلقه، اولین عدد لیست که 5 باشه رو انتخاب میکنیم، و میریم کوچیکترین عدد داخل لیست که از 5 هم کوچکتر هستند و در سمت راست عدد ما قرار دارند رو پیدا میکنیم، که در این جا، 1 است !، جای 1 و 5 رو باهم عوض میکنم ..

1 - 4 - 7 - 5 - 23 - 6

خوب، حالا میریم دویم عدد تو لیست، که 4 هست، سمت راست 4، هیچ عددی قرار ندارد که از 4 کوچک باشه،
پس عدد بعدی، 7 است. 5 کوچکترین عددی است که در سمت راست 7 قرار دارد، پس جایش را با 7 عوض میکنیم.
LTR]
1 - 4 - 5- 7- 23 - 6
[/LTR]
خوب دوباره عدد، بعد در لیست ما، 7 است، کمتیرین، عدد در سمت راست، 6 است و جای اونرو با 7 عوض میکنیم...
LTR]
1 - 4 - 5- 6- 23 - 7
[/LTR]
حالا عدد بعدی 23 است، که جای اون رو با 7 عوض میکنیم. و به انتها لیست رسیدیم.
ولی دوباره باید لیست رو چک کنیم، تا ببنیم sort است یا نه، اگر نبود دوباره جا به جایی رو انجام بدیم!!!! کافی بود یک کامل تر بگم؟

میلاد قاضی پور
پنج شنبه 09 اردیبهشت 1389, 21:29 عصر
راستش شما سوأل منو یه جور دیگه توضیح دادید .مفهوم سورت کردن رو بلدم. من میخوام بدونم این کارایی که گقتید چطور انجام میشه ؟ چه شروطی لازم هست ؟ از چه حلقه ای باید استفاده بشه ؟ چند تا متغیر لازم داریم ؟... این مخ ما رعد و برق هم کمشه ...:لبخند:

میلاد قاضی پور
پنج شنبه 09 اردیبهشت 1389, 22:02 عصر
ببینید من میتونم کوچکترین عدد رو پیدا کنم ولی وقتی پیدا کردم ، نیاز دارم که اون عدد رو از دور خارج کنم و مقایسه رو با بقیه اعداد ادامه بدم .

1-عدد اول را در min بگذار
2-عدد بعدی رو در b
3-اگر b<min بود , b رو در min بذار در غیر اینصورت برو به 5
4-برگرد به 2
5-min رو چاپ کن و حذف کن
6-اگر تعداد اعداد بیش از یکی بود برگرد به 1
-پایان

Pooria121
پنج شنبه 09 اردیبهشت 1389, 22:39 عصر
ببین، چندین مدل الگوریتم هست برای sort که زمین تا آسمون باهم فرق دارند ! من کل کدش رو به صورت C++‎‎ مینوسیم دیگه انشالله مشکلی پیشنیاد...




#include <iostream>
using namespace std;
int main(){
// 6 ta adad!!! be hamin tartibi ke hastan!
int list[] = {5,4,1,3,2,0};


//sort

for(int i = 0; i < 6-1; i++){
int temp = i;
for(int j = i+1; j < 6; j++){
if(list[temp] > list[j]){
temp = j;
sorted = false;
}
}
//swap the two
int mytemp = list[i];
list[i] = list[temp];
list[temp] = mytemp;
}


//print array
for(int i = 0; i < 6;i++){
cout << list[i] << endl;
}
return 0;
}

qwerty11
پنج شنبه 09 اردیبهشت 1389, 22:40 عصر
ببین دوست عزیز، جواب خیلی ساده تر از اون چیزیه که شما فکر میکنی ! :

برای ایندکس های 1 تا n مینیمم را پیدا کن و با خانه ی اول آن را تعویض کن.
برای ایندکس های 2 تا n مینیمم را پیدا کن و با خانه ی دوم آن را تعویض کن.
برای ایندکس های 3 تا n مینیمم را پیدا کن و با خانه ی سوم آن را تعویض کن.
.
.
.
اوکی !؟

mohsensaghafi
پنج شنبه 09 اردیبهشت 1389, 23:22 عصر
دوست عزیز سلام.
او الگوریتمی رو که توضیح دادی یه روش برنامه نویسی که دیگه تقریبا منسوخ شده. امروزه برنامه نویسی ساخت یافته جای اون رو گرفته، پس باید الگوریتم ها رو هم باید بصورت ساخت یافته طرح کنی و حل کنی.
و باید به این توانایی برسی که بتونی از الگوریتم کد بنویسی و از کد بتونی الگوریتم رو دریافت کنی.
دوستان راهنمایی خیلی خوبی کردن و حتی کد رو هم برات گذاشتن
ان شاء الله که موفق باشی.
یا علی!

میلاد قاضی پور
جمعه 10 اردیبهشت 1389, 04:09 صبح
ضمن تشکر از همه من باید اینو هم خدمتتون عرض کنم که نوشتن این برنامه در سی شارپ و جاوا اسکریپت و ویژوال بیسیک برام عین آب خوردنه . چون استفاده از آرایه ها کار رو تموم میکنه . دوستم پوریا جان هم از آرایه ها استفاده کردن . من میخواستم بدون استفاده از آرایه ها اینکارو بکنم . سایتهای انگلیسی و فارسی این روش رو هزاران بار توضیح دادن (استفاده از آرایه ها) . من میخوام طوری اینکارو بکنم که وقتی توی کلاس به دانشجو ها توضیح میدم درک کنن . چون اونها هنوز با آرایه ها آشنا نیستن .

Pooria121
جمعه 10 اردیبهشت 1389, 04:38 صبح
ضمن تشکر از همه من باید اینو هم خدمتتون عرض کنم که نوشتن این برنامه در سی شارپ و جاوا اسکریپت و ویژوال بیسیک برام عین آب خوردنه . چون استفاده از آرایه ها کار رو تموم میکنه . دوستم پوریا جان هم از آرایه ها استفاده کردن . من میخواستم بدون استفاده از آرایه ها اینکارو بکنم . سایتهای انگلیسی و فارسی این روش رو هزاران بار توضیح دادن (استفاده از آرایه ها) . من میخوام طوری اینکارو بکنم که وقتی توی کلاس به دانشجو ها توضیح میدم درک کنن . چون اونها هنوز با آرایه ها آشنا نیستن .

شما برای ذخیره ی Data باید از یک Data-structure استفاده کنید، حالا اون میتواند Array باشد یا Linked-list و یا ...
همانطوری که گفتم چندین مدل برای sort داریم، که بعضی از آنها از Tree برای ساختار استفاده میکنند.

مهمترین قسمت این است که، عملیات sort(مثلا در مثال ما، selection sort) ، یک Algorithm بیشتر نیست، که شما میتوانید آنرا یا به کمک Array یا ArrayList یا LinkedList یا Skiplist و ... اجرا کنید، تنها تغییر در کد، قسمت هایی است که شما به اطلاعات میخواهید دسترسی پیدا کنید، به عنوان مثال اگر در Array شما با مشخص کردن index در [] این کار رو میکنید، در linked-list شما باید بصورت، حلقه روی لیست iterate کنید تا به element مورد نظر برسید.

بنده مثال selection sort رو در قسمت معماهای C/C++ در صفحه 11 با linked-list نوشته ام که میتواند مثال خوبی برای شما باشد.

ولی به نظرمن، Array ساده ترین چیزی است که یک تازه کار (شاید دانشجوهای شما) میتوانند متوجه شوند.

exe123
سه شنبه 01 تیر 1389, 00:43 صبح
با سلام خدمت شما

بی مقدمه میرم سر اصل مطلب ،نگاه شما اگه بتوانید 2 یا چهار عدد را بدون تابع مرتب کنید در واقع جای انها را بایکدیگر عوض نمایید مرتب سازی را به طور کامل فرا میگیرید در واقع در ارایه ها نیز هیمین جابجایی صورت میگیرید با این تغییر که ما اندیس های ارایه را جابجا میکنیم ان هم با حلقه for ، که دیگر لازم نیست به تک تک عضو های ارایه رابا یکدیگر مقایسه کنیم ، اما اگر به طور دستی(یعنی بدون ارایه) این کار را انجام دادیم باید تک تک عضو های ان را با یکدیگر مقایسه کنیم .
اگر نتوانستی کدش را پیدا کنی یا با ایمیلم یا در این تاپیک بگو تا حتما برایت بگویم

hadi-me251
یک شنبه 10 فروردین 1393, 23:26 عصر
هر چند خیلی از زمان سوال گذشته ولی مرتب سازی بدون نیاز به دونستن تعداد کاراکتر های ورودی ،بدون استفاده از آرایه و در حد مبتدی در C++‎:
(در ضمن با تشکر از دکتر بازرگان)



{
int counter;
int input;//adad-e vorodi
int input_copy;// copy adad-e vorodi
int yekan;//zakhire taghirat
int out;

cout << "adad????????"<<endl;
cin >> input;
for (counter = 9; counter >= 0; counter--)
{
input_copy = input;
while (input_copy > 0)
{
yekan = input_copy % 10;
input_copy /= 10;
if (yekan == counter)
{
cout << yekan;
}
else if (counter == 0 && yekan == 0)
{ cout << 0; break; }
}
}
cout << endl;
}

Shaaaaar
چهارشنبه 12 شهریور 1393, 13:29 عصر
[QUOTE=میلاد قاضی پور;966535]سلام . من قصد دارم برنامه ای بنویسم که یه سری عدد رو به صورت صعودی یا نزولی مرتب کنه . در مورد الگوریتمش یه ذره ضعف دارم . دوست ندارم کسی الگوریتمشو کامل بنویسه اینجا ولی کمی راهنمایی نیاز دارم تا مراحل کار رو درک کنم . تعداد اعداد بر فرض 10 تا باشه[/QUOTE