صفحه 1:
۳ jo
بانی کامپیوتر و برنامه سازی
فصل دهم : آرایه ها
تهیه اسلایدها: دکت
Hod ایدها: دکتر سعبد ابر
يد ابريسمى
مدرس :
رس : سيد كاظم شكفته
صفحه 2:
sess ۳ آرایه ها
* در مبحث | الكوريتمها با يك ساختمان داده مهم, يعني آرایه
© البته د © oils, giles bu هاي ديكر ي همجون ساختارها
نیز وجود دارند, اما آرایه ها همچنین مهمترین ساختمان
داده موجود در اين oe,
۶ آرایه د ) عبارنست از مجموعه اي از داده هاي همنوع
ل he Ca نام مشترك و در خانم هاي متوالي فط
Se te ol عناصر آرایه, باید از نام آرایه بعلا
ي دسترسي به عناصر ارایه. باید از نام ارایه بعلاوه
أنديس استفاده كرد. 7 7
* در قسمتهاي بعديء, نحوه تعريف و استفاده از ارايه ها را
تشريح خواهيم
صفحه 3:
۱-۵۰ آرایه های یک بعدی
۰ پیش از آنکه بتوان از يك آرایه يك بعدي استفاده کرد, باید آن را اعلان
د.
* اعلان آرایه ها بصورت زیر انجام مي گردد:
<type> <var-name>[<size>] ;
۴ بعنوان مثال:
int A[10];
* خط بالا يك آرایه 10 تايي از اعداد صحیح بنام ۸ ایجاد مي نماید.
* هر کدام از عناصر این آرایه مي توانند بعنوان يك متغیر مستقل مورد
استفاده قرار گیرد.
* براي دسترسي به عناصر این آرایه باید از اندیس استفاده نمود. در
زبان ) اندیسها در داخل کروشه [] قرار مي گيرند.
© نکته بسیار مهمي که باید بدان توجه کرد آنستکه در 6 اندیس يك عدد
صحيح است كه أز 0 أغاز مي كردد.
صفحه 4:
':::: ۱-۱۰ آرایه های یک بعدی
rt @[G0) ;
©
! ! | ! |
QO] ۵10 [2] OP] eS]
۵6-9:
صفحه 5:
۱-۰ آرایه های یک بعدی
: درف و بیس چاه مد او از ماگ كلق pate lt Ie antes fat lank he
othe, ana ce
Eh بش وق
لكر لاسي ب ]کی لد چل ندز له
ny شفنب ی ره
‘include <stdio.h>
‘oid maind { ۳
آرايه نكهنايعمعدل لتشجويان/ :(100]وف6لة متا
آرليه تكهد يليه «انشجوانا 10100 ا وما
استكيك ل لشحوانا :عودعتضافيها float
int in:
Brinti(enter numberof students :°)
Seant(%ea", Sa دییات هداد دنشجوان/
حلفه یناف شخصانتانشجوباو مخاسیه مبانگینمعدلها
120101 :0 001
ی
|
totalAverage += averagelil:
>
زو دا totalaverage
حلقه دريافتصقايسه معدلهر دلنشجو با مباتكيركلاسو جاتعيام متاسلة
( لج ادم 0:1 60610
It (averagefi} >= totalaverage + 1)
printf("6ld excellent fn", ii):
elseif (averageli] >= totalaverage - 1)
printf("Sld : good In, ii)
cele print("%ld = weak Nin, lai):
صفحه 6:
:۱-۱۰ آرایه های یک بعدی
* جند نكته مهم راجع به آرايه در © وجود درد كه حتما بايد به آنها دقت كنيد
* اندازه آرايه ها در © ثبت بوده و حتما بايد توسط بك مقدار ثابت صحيح تعيين كردد. بعنوان
با ا قن ا کرد
int n;
n=100 ;
int Aln);
Ll توان با استفاده از متغير هاى ثابت (ثابتهاي داراي نام). اندازه آریه را gua 515 2
اي بعدي ay آن آشاره خواهد شد
pais" آرايه ها در © عدد رده و هميشه ود. لذا به تفاوت iL
Jr ae خنصر أرايه” يعد شه أن 8 شروع مي شود. لذا يع تفاوت ag" 4و eae
خطاهاي متطقي مي گردد.
9 6 آرايه ها ردد. بدين معنا كه جنا: اند محدوده مجاز يك
S38 PALES epee the sit is |
اي منطقي خواهد کرد. بعنوان مثا
int A[10];
A(12] = 20 ; //this is not a syntax error but a logical error 7
لذا بررسي مرزهاي آرايه بعهزه خود برنامه نوين است و بايد از درستي برنامه خود و خارج نشدن
جار ان ا
از محدوده
صفحه 7:
۱-۰ آرایه های یک بعدی
مقداردهي اولیه به آرایه هاي يك بعدي بصورت زیر انجام مي پذیرد:
int A[3] = {5, 2, 8};
که در اینجا [۸]0 برابر 5 , [۸]1 برایر 2 و [۸]2 برابر 8 خواهد شد.
علاوه ترا إن فقط بد تغدادي ار عناضر آرابه مقدار داد دزلیتمتوزت: مهد
عناصر باقیمانده آرایه اتوماتيك 0 خواه که مقدار دا درابتصورت مار
int B[10] = {5, 8};
در اينجا عناصر [8]2 يم بعد مقدار 0 as ales بنابراین مي توان براي 0 کردن
عتاصر يك أرأية به
int C[10] = {0};
به آرایه مقدار دهي اولیه کرده با ان تعداد عناصر آرایه را نیز"
جنانجريه أرايم قدا ن دای أوايه كردم باقيم» موق تما مدا دا الو كد
خواهد شد
int C[] = {10, 15, 20};
در مثال فوق آرایه > با 3 عضو درنظر گرفته مي شود.
صفحه 8:
۲-۰ متغیرهای ثابت
همانطور که در قسمت قبل گفته جه اندازه يك آرایه cali ub صحبح
شام gusto ol Cie یا
متغير ثابت» ي است که فقط مي تواند در هنگام اعلان مقدار |وليه
کیرد وا مقدار دیگر قابل تغییر تیست. براي اعلان متگيرها هاي ثابت, از كلمه
const gals قبل از نوع متفیر استفاده مي کردد. بعنوان مثال:
const int k = 10;
نه تلاش Le مقدار , باعث ایجاد تك خطاي تحوی توسط
esse مر و
Gil متغيرها دن تغزيف: م فاد تابتی که مقدار آنها در طول برنامه تغییر نمی
كندء بکار می روند بعنوان مثال :
const float pi = 3.14;
كار نه تنها خوانابى برنامم را لا مي برد (بدلیل استفاده از كلمع أن كه
برای همه شتاخته شده است), بلکه باعث مى شود تقببر بذيرق برنامه نيز بالا
د. بد > ام تصميم كرفت مقدار ثابت
عوض کند نيازى به تقبير كل برنامه نبست و فقط كافى است مقدار أوله
متغیر را عوض
صفحه 9:
: ۲-۱۰ متغیرهای ثابت
* از این مسئله می توان در تعریف آرایه ها نیز استفاده کرد.
* بدین صورت که بجای آنکه اندازه آرایه را با یک ثابت صحیح
مشخص نماییم, آن را با یک متغیر ثابت تعریف می کنیم.
* با اینکار, درصورتیکه نیازی به تغییر اندازه آرایه (يا آرایه ها)
گردد, فقط کافی است مقدار اولیه متفیر ثابت خود را تغیبر
دهیم.
*؟ مثال 2) برنامه اي بنویسید که سال ورود تعدادي دانشجو را
دریافت و سپس تعداد ورودي هاي سالهاي 75 تا 84 را
محاسبه و چاپ نماید.
صفحه 10:
#include <stdio.h>
void main() {
const int startYeat
const int yearNi
int countlyearNo]
int i, n, year;
printf("enter student no :
scanf("%d" &n);
for (i=0; i<n ; i++) {
printf("enter entrance yea
scanf("%d",&year);
count [year - startYear] ++;
1
for (i=0 ; i<yearNo ; i++)
printf("year = %d count = %d \n",startYear + i , countli]);
صفحه 11:
: ۳-۱۰ آرایه های چندبعدی
9 نطور كه در يخش الكوريتمها كفته شدء آرايه ها مي توانند
داراي ابعاد بيشتري نيز باشند
* در زبان © نيز مي توان يك آرايه جند بعدي را بصورت زير
اعلان کرد:
<type> <var-name>[<size 1>][<size 2>] ... [<size n>] ;
* بعنوان مثال, اعلان زیر يك آرایه دوبعدي را معرفي مي نماید:
int A[5][8] ;
* برأى دسترسي به هر عنصر إن اين آرايه بابد از دو تلامت []
اسيتفاده كرد. توجه كنيد ها و ستونها هر دو أز
0 آغاز مي دند.
صفحه 12:
:: ۲-۱۰ آرایه های جندبعدی
:6 «
3
م © و ه و 086 ه
© (
ae) 0
م )سر
el fe
el 1?
of 2 3]
6[]0]ه > 66 :
صفحه 13:
۳-۰ آرایه های چندبعدی
° لته در مورد آریه هاي با ابعاد بالاتر نیز به شکل مشابهي عمل مي
دد.
۰ يعنوان مثال به نحوه استفاده از يك آرایه سه بعدي در مثال زیر دقت
int B[S][8][6] ;
B[2][4][0] = 12;
* مثال 3) یکی از اساتید قصد دارد آماری از نمرات دانشجویان خود در
پیز های بین ترم تهیه نماید. وی 5 گوییز در طول ترم برگذار نموده
است و اکنون نیاز به اطلاعات زیر دارد:
* میانگین نمرات هر دانشجو برای کل کوییزها
© میانگین تمرات کل دانشجوبان برای فر کوب
برنامه اي بنویسید که نمرات دانشجویان را براي 5 کوییز دریافت
otue سيد كه “مرا | شجوبارورا براقم 5 كوبيز ذريافت زو
صفحه 14:
:۲-۱۰ آرایه های چندبعدی
کوییز کوبیز کوییز کوییز کویبز
پنجم چهارم سوم دوم اول
{til
میس افاللجوتاول:
جه دانشجوی دوم
مب دانشجوی سوم
صفحه 15:
: ۳-۱۰ آرایه های چندبعدی
#include <stdio.h>
const int maxStudent = 100; حجلکثر تعداد دلنشجویارا/
const int quizNo = 5; تعداد كوتيزها//
void main() { ب
float grades[maxStudent][quizNo]; /نايوجشنل آرليه نكهدارئنمرات
float quizAverage, میانگینن مرانتهر کونیز//
studentAverage; میانگینت مراتهر دلنشجو//
inti, j, n;
printf("enter number of students: ");
56۵066960۳ دریافنتعداد دلنشجویار/ ... :(طی6,
حلقه دریافناطلاعاندلنشجوبار)/
for (i=0 ; i<n ; i++) {
printf(student no %d:\n",i+1);
for (j=0 ; j<quizNo ; j++) {
printf(“enter grade of quiz %d: ", j+1);
scanf("%f", &gradesfillj]);
1
1
صفحه 16:
: ۳-۱۰ آرایه های چندبعدی
حلقه هاعمتداخلب راعمحاسبه میانگیننمراتهر دلتشجوا/
printf(*Student's averages:\n");
for (i=0 ; i<n; i++) {
studentAverage = 0.0;
for (j=0; j<quizNo; j++)
studentAverage += gradesfillj];
studentAverage /= quizNo ;
printf("student no %d: average=%f \n",i+1, studentAverage);
1
حلقه هاعمتداخلی رایمحاسبه میانگینن مرانهر کوثیزا/
printf(“Average of each quiz:\n");
for (j=0 ; j<quizNo ; j++) {
quizAverage = 0.0;
for (i=0; i<n; i++)
quizAverage += gradesfillj];
quizAverage /=n;
printf("quiz no %d: average=%f \n",j+1, quizAverage);
1
+
صفحه 17:
۳-۰ آرایه های چندبعدی
* و نکته آخر اینکه مقداردهي اولیه به آرایه هاي چندبعدي
آمکان پذیر است و بصورت زير انجام مي پذیرد:
int A[3I4] = { (12, 5, 3, 8}, 3,7, -9, 2}, (4, 22, 18, 61 (:
* يعني يك علامت () براي كل مقداردهي قرار مي كيرد.
سبس هر رديف از آرايه در داخل يك (1 مجزا قرار مي
* براي ابعاد بالاتر نيز به روش مشابهي عمل مي كردد. بعنوان
مثال براي ارايه هاي سه بعدي داريم:
int A[2][3][4] = { { {12, 5, 3, 8}, {-3, 7, -9, 2}, {4, 22, 18, 6} },
{ {8, 1, -3, 4}, {-2, 8, 11, 21} , {7, 3, -15, -
8}}};
صفحه 18:
7 ۴-۰ ارسال آرایه های یک بعدی به توابع
* آرایه ها را نیز همچون سایر نوع داده ها می توان به یک تابع ارسال
کرد. برای اینگار ابتدا باید تابع را بگونه ای تعریف کنیم که یک پارامتر
از نوع آرایه را دریافت کند.
* فرض کنید تابعی بنام 5۱۲۱۸۵۲۲۵۷ داریم که یک آرایه یک بعدی از اعداد
w را بعنوان ورودی دریافت می نماید و مجموع عناصر آن را باز
مى ube
* تعريف اين تابع بصورت زير است:
int sumArray(int A[], int size) {
int i, sum = 0;
for (i=0; i<size; i++)
sum += Ali];
return(sum) ;
}
صفحه 19:
۴-۰ ارسال آرایه های یک بعدی به توابع
* همانطور كه من بینید, اندازه آرایه مشخص نشده است و این یک نکته مثبت است؛ چرا
ا مى توانة هر أرايه صحيحى را با هر تا آی دریاقت eels
۰ درواقع حتى اكر اندازه آرايه را نيز مشخص نماييد. كامبايلر از آن صرفتظر خواهد كرد.
دومین پارامتر, اندازه واقعی آرایه ۸ را مشخص مي نماید. معمولا توایع بگونه ای نوشته
من ios که هنگام ارسال یک ارایه به یک ube انداره آن نیز بعنوان یک let آرسال
By
در هنگام فراخوانی تایع 50۳۱۵۲۲۵۱۷, برای ارسال آرایه موردنظر کافی است که تنها نا
ام فراخوا م
آرابه را بدون کروشه تفا را رنه مهن
void main() {
int data1[3] = {5, 10, 15};
int data2[5] = {1, 6, 4, 12,5};
int sum1, sum2;
sum1 = sumérray(datal, 3);
sum2 = sumArray(data2, 5);
printf("sum1 = %d\n",sum1);
printf("sum2 = %d\n",sum2):
صفحه 20:
۰ زاو آرایه ها را توسط ارجاع به تا
۴-۰ ارسال آرایه های یک بعدی به توابع
woe se es ارسال آرايه ها به توايع ات L و
۳ که
الک رد هه بای تس اه شود هشال مب شود ۴ ۲
sate veal J Se ai Lal p65. 339 sal
کر حقیقت پر فصاهای بعدی خواهیم a که برای ارسال یک آرايم آدرمب اولین کنر آن
دتفتزسی ییا
اما چرا > در مورد آرایه ها به روش متفاوتی عمل می نماید؟
* دلیل اين مسئله آن است که لا یک آرایه حافظه بسیار زیادی را اشفال می کند؛ لذا
یک کبس كردن آذ ural sol باعت اشفال حافظه می شود بلکه زمان زيادی را نیز رو We
اما آيا مى توان یک آرایه را توسط مقدار به یک تابع ارسال کرد؟
* متاسفانه خیر.
اما اگر تگران تغیب آرایه ارسالی به یک تابع هستید می توانید آن را بگونه ای به
الو وا سوت باه بلس یی یه تفستية مى SES SE
بآن © بك نحوه ديكر ارسال داده ها به تون بنام ارسال توسط ارجاع ثايت م
نانجه در هنكام تعریف یک پارامتر از یک تابع, از کلمه کلیدی ]05 استفاده شود,
اجا مقادیر آن پارا 1 1 ای تا اهد داد. با ارسال
را اه ا ل رم ۳
صفحه 21:
: ۴-۱۰۱ ارسال آرایه های یک بعدی به توابة
* مثال 4) برنامه ای بنویسید که با استفاده از یک تابع, اشتراک دو مجموعه را محاسبه و چاپ نماید
void intersection(const int Af], int na, const int B[], int nb, int C[J, int &ne) {
int .k,j,sw;
=0;
j<na; i++) {
fC) 5
i<size; i++)
printf("%d ",setfi]) ;
printf("}\n");
1
صفحه 22:
۴-۰ ارسال آرایه های یک بعدی به توابع
void main() {
int set1[5] = {5, 8, 3, 12, 20};
int set2[3] = {12, 16, 8};
int result(3] , resultsize ;
intersection(setl, 5, set2, 3, result, resultSize);
printf("set 1
printSet(set1,5) ;
printf("set 2
printSet(set2, 3)
printf("intersection = ");
printSet(result,resultSize) ;
1
setl={5 83 12 20}
set2={12 16 8}
intersection = { 8 12}
صفحه 23:
۵-۵۰ ارسال آرایه های چندبعدی به توابع
در اين قسمت, ابتدا به نجوه ارسال ola al] دوبعدی به توابع مى يردا
abl cane هاى با أبعاد بالأثر را بررسي alee ا
شابد تصور كنيد كه براى تعريف يك أرايه دوبعدى بعنوان بارامترى ازيك نا
تنها فرار دادن دو علاعت [) کاقی است و pigs ome بان 2
* اما متاسفانه اینگوته نیست, بلکه برنا باید تعدار ستونهای آرایه دوبعدی را
See oat ol LI. a be رویتهای وهای آرایه کوتجدی زا
بعنوان مثال فرض كنيد تايعى مانند 65) داریم که بعنوان ورودی یک آرایع زو
بعدى و تعدادى بأرامتر ديكر درياقت مى كند. "تیف نان بصورت زیر اب
a
void test(int A[][], ...) {
تعریف درست. تعریفی مانند زیر است:
void test(int A[I[101, ...) {
در هنكام فراخوانى تابع :165, مى توان هر آرایه دوعدی 9 ره آن
ارسال کرد ۳ ارسالى ان عدر توا لدو
تواند
صفحه 24:
۵-۵۰ ارسال آرایه های چندبعدی به توابع
* مثال 5) تایعي بنویس aS میزان فروش تعدادي شرکت در 32 ماه سال را بعنوان
ورودي د یافت, و فروش شرکتي را که بیشترین میانگین فروش را داشته
caus باز"
float maxSales(const long int sales[][12], int companyNo) {
int i,j;
float average , max:
max = 0.0;
for (i=0 ;i<companyNo; i++) {
average = 0;
for (j=0; j<12; j++)
average += sales[i][j] ;
if (average > max)
max = average ;
return(max);
صفحه 25:
۵-۵۰ ارسال آرایه های چندبعدی به توابع
* مثال 6) برنامه ای بنویسید که حاصلضرب دو ماتریس را با استفاده از یک تابع محاسبه نماید.
#include <stdio.h>
const int maxCol = 10;
vold_multipiy(const int AlIimaxCol}, const int B{]imaxCol}, int m.intp, int n, it Cl}tmaxColl )
inti,j,k,sum;
for (k=0; k<p; k++)
sum += Afil[k] * BIk]G] ;
sum; = زا[
1
void printMatrix(int matrix{][maxCol], int row,int col) {
int
for
row; i++) {
for (j=0; j<col ;j++)
printf(*96d *,matrix(ilGD):
printf("\n");
0
)
صفحه 26:
۵-۵۰ ارسال آرایه های چندبعدی به توابع
void main() {
int matrix1[2}[maxCol] = { {7 3,2}, (-2, 6,1} };
int matrix2[3][maxCol] = { {2,7,-4,-1}, (3,-3, 5, -8}, {6,-7, 2,3} };
int result[2}imaxCol] ;
multiply(matrix1, matrix2, 2, 3, 4, result);
printf("matrix1 is \n");
printMatrix(matrix1,2,3) ;
printf("\nmatrix2 is :\n");
printMatrix(matrix2,3,4) ;
printf("\nmultiply of matrix and matrix2 is :\n");
printMatrix(result,2,4) ;
+
matrixd is:
732
261
matrix? Is:
27 4 1
3-35 4ه
6723
multiply of matrix] and matrix 2 is
35 26 -9 -25
20 -39 40 -43
صفحه 27:
۵-۵۰ ارسال آرایه های چندبعدی به توابع
* اما ارسال آرايه هاي با ابعاد بالاتر به توايع نيز مشابه 0 هاي دوبعدي
© به اير ت که در هنگا یف يك پارامتر از تا ان يك آ ۱
أن صورت كد ردن Ne AP Ee بعدی
بايد حتما مشخص
5 تفتوان ال هقالع زیر قبت وه
void test(int A[][5][10], ...) {
* اين تابع يعنوإن ورودي بك آرايه سه بعدي دريافت مي تمايد كه حتما بايد
بعد دوم وت و ل
صفحه 28:
۶-۰ برخی عملیات مهم برروی آرایه ها
* همانطور که قبلا گفته شد, آرایه ها از ساختمان داده هاي
بسیار مهم برنامه نويسي بوده و تقریبا مي توان گفت هیچ
برنامه اي وجود ندارد که به نحوي از آرایه ها استفاده نکند.
* به همین دلیل براي انجام بعضي از عملیات مهم بر روي آرایه
هاء الكوريتمهاي كارا و موثزي توسط محققين ابداع شده
است, كه جند نمونه از مهمترين انها را بررسي مي نماييم.
صفحه 29:
۱-۶-۰ الگوریتمهای مرتب سازی
؟ شاید مهمترین عملي که برروي يك ارایه يك بعدي انجام
مي شود, مرتب كردن ن بصورت صعودي يا نزولي آست.
* بدليل اهمیت lS oul الگوريتمهاي متعددي براي آن ابداع
شده است که برخي زان بسیار پیچیده هستند.
* در اينجا 3 ۱ پتم ساده د بررسي فته اند که
در اش 3 الکو کوج تسیا ده موره بررسي قرار كرفته اند ك
Ge رایه هاي بزرگ: بابد از روشهاي پچیده تري
استفاده شود که در كتابهاي پیشرفته تر مورد بررسي قرار
گرفته اند.
9 در الكوريتمهاي زير قرض شذه ابت كه قعد دار all
at) رت صعودي جه با يك تغيير كوجك
توآن ان را به نزوا ٠ تبدي emt ol
صفحه 30:
۱-۱-۶-۰ الگوریتم مرتب سازی انتخابی
16 8 8
22 22 12
12 16 22
35 35 35,
27 27 27
8 12 16
41 41 41
19 19 19
مرحله سوم مرحله دوم مرحله اول
صفحه 31:
۱-۱-۶-۰ الگوریتم مرتب سازی انتخابی
void selectionSort(int A[], int n) {
int i,j;
for (i=0; i<n; i++)
for (j=i+1; j<n; j++)
if (ALi] > ALj]) swap(Alil.ALi)) ;
صفحه 32:
۲-۱-۶-۰ الگوریتم مرتب سازی حبابی
16 16 12
22 12 16
12 22 22
35 27 8
27 8 27
8 35 19
41 19 35
19 11 11
مرحله سوم مرحله دوم مرحله اول
صفحه 33:
+7 ۲۱-۶-۱۰ الگوریتم مرتب سازی حبابی
void bubbleSort(int A[], int n) {
int i, contSw;
do {
contSw = 0;
م
for (i=0; i<n; i++)
if (Ali] > Ali+11) {
swap(A[i], Ali+1]) :
contSw = 1;
}
} while (contSw) ;
}
صفحه 34:
۲-۱-۶-۰ الگوریتم مرتب سازی درجی
؟ در این روش مرتب سازي از عمل درج استفاده مي شود.
* اين روش را مي توان بصورت زیر مرحله بندي کرد:
* مرطله 71 7 فرض مي کم آرایه فقط داراي عتصر او است و سایر
pols را درا شیم در ایتصورت بل epee nated Syl
jee
سعرضر جوم در زره فرب مره قیل درم من عاسم
ig آرایه و ختشری شنت دایم ۳ ۲
> تب mS ۰
ون بك أزايه ند epee مرب ee تا
* مرحله ۲ - عنم ام را در آرایه مرتب ۷-1 عنصري مرحله قبل درج
مي نماییم تا ارایه ) عنصري مرتب بدست اوریم.
* مرحله ۵ - عنصر 0 را در آرایه مرتب مرحله قبل درج کرده تا آرایه
مرتب نهايي حاصل شود.
صفحه 35:
۲-۱-۶-۰ الگوریتم مرتب سازی درجی
16 16 12 12 12 8 8
22 22 16 16 16 12 12
12 12 22 22 22 16 16
35 35 35 35 27 22 22
277 27 27 27 35 27 27
8 8 8 8 8 35 35
41 41 41 41 41 41 41
19 19 19 19 19 19 19
مرحله هفتم مرحله ششم . مرحله پنچم مرطه چهارم مرطه سوم مره دوم مرحله اول
صفحه 36:
۲-۱-۶-۰ الگوریتم مرتب سازی درجی
void insertionSort(int Af], int n) {
int i, j, cur;
for (i=1; i<n; i++) {
cur = Ali];
for (j=i-1; j>=0 && cur<Alj]; j--)
Alj+1] = Ali] ;
Alj+1] = cur;
t
}
صفحه 37:
۲-۱-۶-۰ الگوریتم مرتب سازی درجی
* در مورد سه الگوریتم مرتب سازی ذکرشده چند نکته
قابل ذکر است:
* هر 3 الگوریتم برای مرتب سازي یک آرایه از اعداد صحیح (106)
شته شده اند. آما روش بهتر آن است که آنها را بصورت یک
الگو بنویسیم که قادر به مرتب سازی هر نوع آرایه ای باشند.
و نحوه پیاده سازی آنها در فصل گذشته مورد بحث قرار
هر 3 الگوریتم برای مرتب سازی بصورت صعودی نوشته شده
اند, اما می توان آنها را با یک تفییر کوچک به مرتب سازی نزولی
تبدیل کرد.
حتی می توان wl را بگونه ای نوشت که یک پارامتر دیگر برای
تعیین نوع مرتب سازی نیز بعنوان ورودی دریافت و براساس
مقدار آن, مرتب سازی را بصورت صعودی یا نزولی انجام دهد.
صفحه 38:
+ ۲-۶-۱۰ الگوریتمهای جستجو
* یکی دیگر از الگوریتمهای بسیار مهم برای آرایه هار
الكو ریتمهای جستجو هستند.
* موارد زيادى بيش مى آيند كه قصد داريم به دنبال يى داده در
یک آرایه جستجو کرده و مکان آن را پیدا کنیم.
* در این قسمت دو روش متداول جستجو را مورد بررسی قرار
wo دهیم. البته معمولا برای عمل جستجو از ساختمان داده
های پیچیده تری همچون درختهای جستجوی دودویی استفاده
می گردد, که از بحث ما خارج است.
صفحه 39:
۱-۲-۶-۰ الگوریتم جستجوی خطی
جستجوی خطی, ساده ت جستجو است که در آرایه هاق نامرتب eo
أسيفاد د مت شود در ای نش دادم سورد نر به مركي بأ نك نک اضر أزاية
مقايسه مى شود تا مكان أن بيدا شود.
int linearSearch(int A[], int n, int x) {
int i;
; isn; i++)
Ali]) return(i);
if (x
return(-1) ;
t 0
مقایسه برای بیدا ٩ اگر آرایه دارای 8 باشد, در بدترین حالت نیاز به *
کردن داده مورد نظر داریم و این در صورتی است که داده در آخرین مکان
آرآیه قرار داشته باشد.
* اما از آنجا که احتمال قرار گرفتن داده در هریک از مکانهای آرایه یکسان است.
إما إرالط 5ع اجتمال امن درز مس او مکاهای ارانه کات ابیت
صفحه 40:
۲-۲-۶-۰ الگوریتم جستجوی دودویی
چنانچه آرایه مورد جستجو مرتب شده باشد. روش بسیار کاراتری برای وجود
دار این روش به چستجوی دودویی موسوم آست. با هربر مقایسد. مب آز او
آرلیه را از بازه جستجو حذف می نماید. در نتیجه جستجو در یک آرلیه بزرگ با سرعت"
سيار زيادف صورت فى يديرت
براي تشريح الكوريتم, فرض كنيد آرابه موردنظر بصورت صعودى مرتب شده است.
اند عنص وسط ارازه را cols goo SIS توروجست و را با ان مقاینته می کنيم: سه
حالت ممکن است رخ دهد"
گر داده مورد جستجو با عنصر وسط آرایه مساوی باشد, داده بيدا شده و مكان آن را باز مى
ald
Pal ۰ داده مورد جستجو از عنصر وسط آرایه کوچکتر باشد. بتابراین باید در نیمه اول آرایه به
دنبال آن جستجو نماییم.
کم داده مورد جستجو از عنصر وسط آرایه بزرگتر باشد, بنابراین باید در نیمه دوم آرایه به
دنیال آن جستجو نماییم:
چنانچه حالت اول رخ دهد. جستجو پایان یافته و مکان داده بازگردانده می شود. اما اگر
حالت دوم با سوم رح دهد. عملیات جستجو به روش فوق مجددا برای نیمه اول با نیمه
دوم آرایه تکرار می شود. بدین ترتیب بازه مورد جستجو به نيمى أز أرايه كاهش مي
ابد
عملیات نا oll wile مى يابة کف با واه مور نظر بيدا شود نويا بازة.موزةاستجو
آنقدر کوچک شود که داده ای یاقی نماند (یعنی طول بازه مورد جستجو به صفر برسد),
که ور ایتضورت ذانه دز آرایه وجود ندارد:
صفحه 41:
x —+ a9|
صفحه 42:
۲-۲-۶-۰ الگوریتم جستجوی دودویی
int binarySearch(int A[], int n, int x) {
int low, high, mid;
low = 0;
high = n-1;
while (low <= high) {
mid = (low + high) / 2;
if (x == A[mid]) return(mid);
else if (x < A[mid]) high = mid-1;
else low = mid + 1;
return(-1);
}
صفحه 43:
: ۲-۲-۶-۰ الگوریتم جستجوی دودویی
حد
حد يا
بالا +
11
23
35,
42
53
58
62
71
78
له در دم سا ض يبن بن ات راقص
I
صفحه 44:
۲-۲-۶-۰ الگوریتم جستجوی دودویی
int recBinarySearch(int A[], int low, int high, int x) {
int mid;
if (low > high) return(-1);
mid = (low + high) / 2;
if (x == A[mid]) return(mid);
fs, if (x < A[mid]) return(recBinarySearch(A, low, mid-
x)
else return(recBinarySearch(A, mid+1, high, x)) ;
نحوه فراخواني اولیه اين تابع برای جستجوی داده 52 در آرایه 100
عنصري 0812 بصورت است:
recBinarySearch(data, 0, 99, 52)
صفحه 45:
۲-۲-۶-۰ الگوریتم جستجوی دودویی
* براي محاسبه زمان مورد نیاز يك جستجو, باید به اين نکته
توجه کرد که با هر مقایسه, بازه جستجو نصف مي شود.
* یدترین حالت زماني است که داده اصلا پیدا نشود و پا در
آخرین مقایسه (زماني که ننها يك عنصر باقي مانده است)
بيدا شود.
* سوال اينجاست كه جند بار مي توان اندازه آرايه را نصف كرد
تا سرانجام به يك عنصر رسيد؟
log;
* بعنوان مثال در يك آرایه با 1.000.000 عنصر, تنها به 20
مقایسه نیاز است. به همین دلیل جستجوي دودويي يكي از
بهترین روشهاي جستجو محسوب مي گردد.
صفحه 46:
۳-۶-۰ الگوریتم ادغام
۰ ازا , ادغا مرت تب | Lest آرا
سات ادغام دو آرایه مرتب است. plea آرليه
ا
۰ مك روش ضیف برای این کار آن است که اند نا
أيه ab اب تب
rule خواب كيم كليم ea اللو لد
شبختانه الگوریتم بهتري وجود دارد که در آن نيازي به مرتب سازي
akties هر
۰ طرح كلي اين الگوریتم به شرح زیر است:
يك شمارنده براي هريك از دو آرایه در نظر بگیرید و آنها را برابر صفر قرار
دهید.
رن tte a ee yen زر ین
به أن را يك واحد افرایش دهيد. اين مرحله را تا بايان يافئن 0 از دو آرايه
ر کنید.
gaily L sl sp صر هر
* در پایان, تمام عناصر باقیمانده از آرایه ناتمام را به ترتیب به آرایه جواب منتقل
بید.
صفحه 47:
۳-۶-۵۰ الگوریتم ادغام
14
17
32
43
49
52
56
64
73
14
43
52
17
32
49
56
64
73
صفحه 48:
5 ۳-۶-۱۰ الگوریتم ادغام
void merge(int Al], int na, int BI], int nb, int CU], int &ne) {
int i= =0;
while (icna && j<nb) {
if (AU) < BUD) 1
Ik} = Ali;
iets
+
else if (A[i] > BIj]) {
Ctk] = BI];
jets
+
else {
010 2۸:
i;
jee:
+
زجب
}
for (; i<na; i++, k++) Clk] = Afi];
for (;j<nb; j++, K++) Clk]