برنامه نویسی و دیگر هیچ

فضایی برایه یادگیری برنامه نویسی

برنامه نویسی و دیگر هیچ

فضایی برایه یادگیری برنامه نویسی

شنبه, ۱۱ آبان ۱۳۹۲، ۱۱:۵۳ ق.ظ

مرتب سازی آرایه ها


 

با استفاده از آرایه ها میتوان تعداد زیادی داده را در کامپیوتر ذخیره کرد تا در هر زمان که به آنها احتیاج داشتیم به راحتی قابل دسترس باشند.


مثلا میشه نتیجه نهایی یک آزمون با 1000 شرکت کننده را در آرایه ای ذخیره کرد. حالا اگه بخواهیم بالاترین نمره کسب شده رو چاپ کنیم میشه با یک حلقه و مقایسه تک تک داده ها بزرگترین رو پیدا و چاپ کرد.

ولی یه لحظه فکر کنید اگه نمره ها داخل آرایه به صورت صعودی مرتب بود یعنی کمترین نمره در اولین خانه(با اندیس 0) و بیشترین نمره در خانه آخر ( با اندیس 999)بود خیلی راحت بدون انجام مقایسه با چاپ خانه آخر بیشنرین نمره رو چاپ میکردیم.


یا حتی اگه قرار بود نمرات  را به صورت صعودی چاپ کنیم از خونه اول تا آخر آرایه رو چاپ میکریم.

البته مرتب بودن داده ها درون یک آرایه خیلی بیشتر از اینها که گفته شد بدرد میخوره و بعدا بیشتر متوجه فایده اون میشید.


الان بیاید ببینیم چه روش هایی وجود داره که یک آرایه نامرتب رو مرتب کرد!

روش های مرتب سازی آرایه ها


1- selection sort

2-insertion sort

3-bubble sort




اول از همه فرض کنید یه آرایه به اسم A داربم به صورت زیر:

 

A=7      13      1      58      37

 

فرض کنید A را به صورت صعودی قراره مرتب کنیم

 

1- selection sort

 در این روش مرتب سازی از اولین خانه آرایه شروع میکنیم و آنرا با تک تک خانه های بعدی مقایسه میکنیم و اگر  محتوای اولین خانه از محتوای یکی از خانه های بعدی بیشتر بود محتوای آنها را جابجا میکنیم  و دو باره به مقایسه اولین خانه با خانه های باقیمانده میپردازیم!

 

مبنا در این روش انتخاب یکی از خانه های آرایه و پیدا کردن  مقدار اصلی این جایگاه است و بعد از این که مقدار اصلی آنرا قرار دادیم میتوانیم سراغ خانه بعدی برویم و دنبال مقدار اصلی آن خانه باشیم! مثلا وقتی آرایه را به صورت صعودی داریم مرتب میکنیم و اولین خانه رو انتخاب میکنیم بعد از یک دور مقایسه مقدار اصلی آن که میشود کوچکترین مقدار را خواهد داشت!

 

در اینجا ابتدا اولین خانه رو انتخاب میکنیم ( خانه انتخابی با رنگ زرد در تصویر مشخص شده )

خانه صفرم را با خانه 1 ام  مقایسه میکنیم چون  7 از 13 بزرگتر نیست پس هیچ تغییری نداریم

خب الان میریم سراغ مقایسه خانه 0 ام با 2 ام  چون 7 از 1 بزرگتر هست  محتوای خانه ها را جا به جا میکنبم

تا اینجا خانه اول رو با 2 تا از خانه های بعد از خودش مقایسه کردیم  پس تا آخر آرایه باید ادامه دهیم

حالا خانه 0 ام را با خهانه 3 ام مقایسه میکنیم چون 1 از 58 بزرگتر نیست پس جابجایی نداریم

و در نهایت خانه 0 ام را با خانه 4 ام مقایسه میکنیم و چون 1 از 37 بزرگتر نیست جابجایی نداریم

الان خانه صفرم را با تمام خانه های بعد از خودش مقایسه کردیم و بعد از پایان این مقایسه ها مطمون ایم که کمترین مقدار الان در  همین خانه 0 ام قرار داره

الان میتونیم  خانه  بعدی( یعنی خانه یکم) را انتخاب کنیم و آنرا با 3 خانه بعد از خودش مقایسه کنیم و الی آخر

 

برنامه مرتب سازی selection sort

 

برای مرتب سازی آرایه مفروض A با مقادیر مشخص شده در بالا برنامه زیر را داریم:

#include <conio.h>
#include <iostream>

using namespace std;

int main()
{ int a[5]={7,13,1,58,37};

int i,t,j;
for( i=0;i<5;i++){

for(j=i+1;j<5;j++){
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;

}}}

for( i=0;i<5;i++)
cout<<a[i]<<"\t";
cout<<endl;


getch();
}

همین برنامه رو میتوان برای یک آرایه با اندازه و مقادیر دلخواه نوشت. فرض کنید یک آرایه با سایز دلخواه داریم که با اعداد تصادفی مقدار دهی شده است سپس آنرا با الگوریتم selection به صورت صعودی مرتب میکنیم:

#include <conio.h>
#include <iostream>
#include <time.h>
using namespace std;

int main()
{
srand(time(0));
cout<<"andaze array >>> ";
int n,i,j,t;
cin>>n;
int arr[n];

for( i=0;i<n;i++)
arr[i]=rand()%100+1;

for( i=0;i<n;i++)
cout<<arr[i]<<"\t";
cout<<endl<<endl;

for( i=0;i<n;i++){

for(j=i+1;j<n;j++){
if(arr[i]>arr[j])
{
t=arr[i];
arr[i]=arr[j];
arr[j]=t;

}}}

cout<<" array moratab "<<endl;
for( i=0;i<n;i++)
cout<<arr[i]<<"\t";
cout<<endl;

getch();
}

 

2-insertion sort

 

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

 

   فرض کنید آرایهبا مقادیر A=7      13      1      58      37 را قرار است با روش درجی به صورت صعودی مرتب کنیم.

در شکل زیر مراحل مرتب سازی در پایان هر مرحله را مشاهده میکنید.






توضیحات: در ابتدا بخش مرتب شامل عدد 7 است و بخش نامرتب شامل اعداد 37و58و1و13.

در مرحله اول خانه شماره 1 ام را به عنوان key در انتخاب کرده اگر از خانه 0 ام کوچکتر بود قبل از آن قرار میگیرد و اگر از آن بزرگتر بود تغییری نداریم.

(الان key عدد 13 است و چون از 7 بزرگتر است تغییری نداریم.)
( پس بخش مرتب شامل اعدا 13و7 است و بخش نامرتب شامل اعداد 37و58و1.)

در مرحله بعد خانه شماره 2 را به عنوان key انتخاب کرده با 2 خانه قبل از خودش یعنی خانه 1 ام و 0 ام مقایسه میکنیم و در هر جا که مقدار یکی از خانه ها از keyکوچکتر بود مقایسه را متوقف کرده و مقدار key را در آن خانه قرار میدهیم.

(الان key عدد 1 است . اول 1 را با 13 مقایسه میکنیم چون 13 از 1 بیشتر است سراغ خانه بعدی یعنی عدد 7 میرویم و در اینجا چون 7 از 1 بزرگتر است و تمام اعداد بخش مرتب را با key مقایسه کردیم .پس 1 قبل از 7 قرا میگیرد.)

پس در  هر مرحله عدد key را با خانه های قبل از خود مقایسه کرده و اگر مقدار خانه ای از key کمتر بود مقایسه را متوقف میکنیم و مقدار key  را در همان خانه قرا میدهیم .


  برای مرتب سازی آرایه مفروض A با مقادیر مشخص شده در بالا برنامه زیر را داریم:

#include <conio.h>
#include <iostream>
using namespace std;

int main()
{ int i,key,j;
int a[5]={7,13,1,58,37};


for( i=1;i<5;i++) //مراحل مرتب سازی
{
key=a[i];
for(j=i;j>0;j--)
{
if(key>=a[j-1])
{break;}

a[j]=a[j-1];}

a[j]=key;}


cout<<"namyesh array moratab"<<endl;
for( i=0;i<5;ه++)
cout<<a[i]<<"\t";
getch();}

  مراحل مرتب سازی آرایه A به تفکیک:

  A=7   13   1   58   37

------------------------------------
i=1    key=13

j=1 -->  7   13   1   58  37
 
A=7   13   1   58   37

------------------------------------

i=2    key=1

j=2 -->  7   13   13   58  37

j=1 -->  7   7   13   58  37


A=1   7   13   58   37
------------------------------------

i=3    key=58

j=3 -->  1   7    13   58  37


A=1   7   13   58   37
------------------------------------

i=4    key=37

j=4 -->  1   7    13   58  58

j=3 -->  1   7    13   58  58

A=1   7   13   37   58



فرض کنید یک آرایه با سایز دلخواه داریم که با اعداد تصادفی مقدار دهی شده است سپس آنرا با الگوریتم insertionبه صورت صعودی مرتب میکنیم:

#include <conio.h>
#include <iostream>
#include <time.h>
using namespace std;

int main()
{ srand(time(0));
cout<<"andaze array >>> ";
int n,i,j,key;
cin>>n;
int arr[n];

for( i=0;i<n;i++) //مقدار دهی تصادفی
arr[i]=rand()%100+1;

for( i=0;i<n;i++) //نمایش آرایه اولیه
cout<<arr[i]<<"\t";
cout<<endl<<endl;


for( i=1;i<n;i++) //مراحل مرتب سازی
{
key=arr[i];
for(j=i;j>0;j--)
{
if(key>=arr[j-1])
{break;}

arr[j]=arr[j-1];}

arr[j]=key;}



cout<<endl<<"-----------moratab----------"<<endl; // نمایش آرایه مرتب شده به صورت صعودی
for( i=0;i<5;i++)
cout<<arr[i]<<"\t";
getch();}

 

نظرات  (۵)

  • فرزانه سجادپور
  • سلام خانم:)
    فلشم همه اطلاعاتش پاک شده بود،برگردوندم ولی فایل هایی که برام ریختید بر نگشت.حالا باید چیکار کنم؟؟:(
    پاسخ:

           سلام دختر خوب:)

    فردا که رفتی مدرسه برو سایت به خانم متقی بگو که فایل devc++ رو از کامپیوتر  معلم برات کپی کنه تو فلشت!

     

    احتمالا تو وبلاگ هم بزارمشون!

  • فرزانه سجادپور
  • بازم سلام:)

    امروز دوباره اطلاعات رو برگردوندم؛ اون فایل ها هم برگشت:)

    ممنونم از راهنمایی تون

    پاسخ:
    :)
  • مطهره نقی زاده
  • سلام خانم!
    یه سوال:برای جملات ثابت  تا graphics رو می نویسم errorمیده!چراش رو نمی دونم!ولی رو اعصاب منه...
    فردا نشونتون میدم تا کمکم کنید!
    امان ازدست این دنیس ریچی!
    الان دارم دعا می کنم:1-)فردا تعطیل باشه2-)روح دنیس جون تو قبر بلرزه!
    مرسی!
  • مطهره نقی زاده
  • سلام خانم!
    یه سوال:برای جملات ثابت  تا graphics رو می نویسم errorمیده!چراش رو نمی دونم!ولی رو اعصاب منه...
    فردا نشونتون میدم تا کمکم کنید!
    امان ازدست این دنیس ریچی!
    الان دارم دعا می کنم:1-)فردا تعطیل باشه2-)روح دنیس جون تو قبر بلرزه!
    مرسی!
    پاسخ:
    سلام دختر خوب:)

    چیکار به دنیس داری آخه!!!؟

    به تلاشت ادامه بده! اگه حل نشد بیار من ببینم.
    salam khanoom
    darbareye matis ha chizi nemizarid?????????????????????
    ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
    شما میتوانید از این تگهای html استفاده کنید:
    <b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
    تجدید کد امنیتی