واضح آرشیو وب فارسی:سایت ریسک: نیاز فوری(الگریتم و فلوچارت) pilevar 29 تير 1386, 10:18سلام کسی میتونه توی جواب این سوال کمکم کنه؟ اگر امان داره شبه کد(الگریتم) اونو برای نوشتنش بهم کمک کنید. البته من در نهایت باید فلوچارتشو رسم کنم. سوال اینه: الگریتمی بنویسید که n عدد را بگیرد آنها را به صورت سعودی مرتب کند. اگر این چور چیزی رو کد visualbasic یا ++C اش رو دارین بزارین متشکر میشم. از روی همون کد ،فلوشچارتشو در میارم. ممنون :cry::cry::cry::cry::cry::cry::cry::cry::cry::cry: :cry: hossein_salehi 29 تير 1386, 14:03سلام. اول یه توضیح در مورد مرتب سازی به روش merge یا ادغام: اصول کار : اگر مجموعه ای از اعداد داشته باشیم و آن را به 2 بخش تقسیم کنیم و هر بخش را جداگانه مرتب کنیم و حاصل را به گونه ای ادغام کنیم که این ترتیب در آن مجموعه حاصله هنوز مرتب باشد در این حالت کل مجموعه مرتب شده به حساب می آید. یه سوال که مطرح میشه اینه که خوب حالا به فرض اونو به 2 بخش تقسیم کردیم - هر بخش به چه صورت مرتب شوند؟ جواب : مشخص است هر بخش نیز به همان صورت مرتب میشود ( 2 تیکه شدن ). یعنی هر بخش کوچکتر هم باید کوچکتر شود و مرتب الی آخر. یه سوال دیگر : این تیکه تیکه کردن داده های خانه آرایه مثلا تا کجا ادامه پیدا کنه ؟ خوب مسلمه که اگر به عنصر تک عضوی رسیدیم دیگه نمیشه اونو 2 تیکه کرد. پس کار خرد شدن ادامه پیدا میکنه تا به یه عنصر ( مثلا یک عدد در خانه ای از خانه های حافظه ) برسیم. ببینید سعی میکنیم این 2 تیکه کردن ها مساوی باشند ( در هر طرف تقسیم تعداد مساوی خانه حافظه یا آرایه قرار گرفته شده باشد ) - دلیلی نداره مساوی تقسیمشون نکنه وقتی .... مراحل کار رو به صورت زیر ادامه میدهیم: - اگر تعداد داده ها یک یا کمتر شد دیگر نیازی به مرتب سازی نیست و برگرد. - وسط داده ها را پیدا کن. - نیمه اول داده ها را به روش Merge Sort مرتب کن. - نیمه دوم داده ها را به روش Merge Sort مرتب کن. - دو نیمه مرتب شده را به گونه ای ادغام کن که حاصل مرتب باشد! کد الگوریتم merge sort : void mergesort (int low,int high) { int mid; if(low<high){ mid=(low+high)/2; mergesort(low,mid) mergesort(mid+1,high); merge(low,mid,high); } زیر الگوریتم merge که در خط آخر الگوریتم بالا میبینید استفاده شده کارش اینه که دو بخش مرتب شده آرایه را با هم ادغام کند به گونه ای که حاصل هم مرتب باشد. فرض کنید شما به تعداد N تا عدد از کاربر با یه حلقه for دریافت کردین و اونو تو یه آرایه گذاشتین که اسم آرایه هم A هست. mergesort(low,mid) این کد بالا شامل بخش اول آرایه A از محل Low تا Mid و بخش دوم آن از Mid+1 تا high را شامل میشود. نکته : چون همل ادغام را نمیشود به صورت درجا انجام داد ( نمیشود همون آرایه که داریم روی آن کار میکنیم بدون خانه حافظه کمکی هم از آن بخ.انیم هم آن را ادغام کنیم ) بنابراین نیاز به یک آرایه کمکی هست به نام B از نوع A و با همان اندازه A. یه مثال میزنم : آرایه ای 10 عنصری به نام A دارم که عناصر 0 تا 4 آن مرتب و عناصر 5 تا 9 هم مرتب هستند. میخواهیم این دوبخش را ادغام کرده و در آرایه B قرار دهیم. A={350,365,390,500,700,340,400,450,490,495} در این وضعیت low=0 , mid=4 , mid+1=5 , high=9 میباشند. برای ادامه کار سه متغییر به نامهای h , i , j تعریف میکنم و نقش های زیر را به آنها میدهیم : h=low محلی از اولین بخش آرایه A که داده آن باید بررسی گردد. j=mid+1 محلی از دومین بخش آرایه A که داده آن باید بررسی گردد. i=low محلی از آرایه B که داده جدید باید در آن ریخته شود. کار : کافی است که داده محل h و داده محل j آرایه A را با هم مقایسه کنیم و آن را که کوچکتر است در محل i آرایه B قرار دهیم. سپس اگر داده محل h کوچکتر بوده است به h یکی اضافه شود و اگر داده محل j کوچکتر بوده است به j یکی اضافه شود. اگر 2 داده مساوی بودند فرقی ندارد که کدامیک انتخاب شود. وچون در آرایه B هم عددی درج شده باید به i یک واحد اضافه شود.عملیات را با h,i,j جدید ادامه میدهیم تا یکی از 2 بخش آرایه A تمام شود. مشخص است که بقیه داده های بخش نا تمام آرایه A باید به همان ترتیب به آرایه B منتقل شوند. ادامه مثال بالا : LEFT]A={350,365,390,500,700,340,400,450,490,495}[/LEFT] h=0 --- j=5 LEFT]B={ , , , , , , , , , }[/LEFT] i=0 پس از انجام اولین مقایسه نتیجه این گونه خواهد بود : LEFT]A={350,365,390,500,700,340,400,450,490,495}[/LEFT] h=0 --- j=6 LEFT]B={340, , , , , , , , , }[/LEFT] i=1 پس از انجام دومین مقایسه نتیجه این گونه خواهد بود : LEFT]A={350,365,390,500,700,340,400,450,490,495}[/LEFT] h=1 --- j=6 LEFT]B={340,350, , , , , , , , }[/LEFT] i=2 اگر این عملیات را برای 6 بار انجام دهید نتیجه زیر بدست می آید: LEFT]A={350,365,390,500,700,340,400,450,490,495}[/LEFT] h=3 --- j=10 LEFT]B={340,350,365,390,400,450,490,496, , }[/LEFT] i=8 در این مرحله بخش دوم آرایه تمام شده است و اعداد باقیمانده بخش اول که 500 و 700 میباشد باید به B منتقل شوند و حاصل به صورت زیر خواهد بود : LEFT]B={340,350,365,390,400,450,490,496,500,700}[/LEFT] حال کافی است که داده های آرایه B را به همان ترتیب به مکان A منتقل کنیم ! حالا الگوریتم merge رو مینویسیم : void mege(int low, int mid, int high) { int h,i,j,k; int B[]; h=low; i=low; j=mid+1; while(h<=mid && j<=high){ if(A[h]<=A[j]){ B[i]=A[h]; h++; } else{ B[i]=A[j]; j++; } i++; } if(h>mid) for (k=j;k<=high;k++){ B[i]=A[k]; i++; } else for(k=h;k<=mid;k++){ B[i]=A[k]; i++; } for(k=low;k<=high,k++) A[k]=B[k]; } برای استفاده از mergesort پس از دریافت داده ها و ذخیره سازی آنها در A الگوریتم را به صورت زیر اجرا کنید : mergesort(0,n-1) شاد باشید. یا علی pilevar 29 تير 1386, 19:00حسین جان ممنون از لطفتون ولی من اینو چطوری به فلوچارت در بیارم. کمی مساله پیچیده شد. درسته گفتم کد c++ بدید ولی نه تا این حد :) ممنون میشم که به زبان الگریتم و شبه کد اینو بنویسی و بهم بدی. جبران میکنم. ممنون hossein_salehi 29 تير 1386, 19:07مراحل کار رو به صورت زیر ادامه میدهیم: - اگر تعداد داده ها یک یا کمتر شد دیگر نیازی به مرتب سازی نیست و برگرد. - وسط داده ها را پیدا کن. - نیمه اول داده ها را به روش Merge Sort مرتب کن. - نیمه دوم داده ها را به روش Merge Sort مرتب کن. - دو نیمه مرتب شده را به گونه ای ادغام کن که حاصل مرتب باشد! خواهش میکنم - الگورینتمش این بالایی بود. البته سطج کاریتون رو نگفتید - منم در سطح کارشناسی دانشگاهی یا کاردانی توضیح دادم! عزیز باید اینو درش بیارین دیگه ! البته به روش ساده تری هم میشه برنامه اش رو نوشت! مثلا استفاده از 2 حلقه FOR تو در تو ... - اینو میخواید ؟ اما خوب روش استاندارد بالایی بود تقریبا ! ( البته روش Quick sort هم بود که سخت تر بود ) pilevar 29 تير 1386, 19:30خواهش میکنم - الگورینتمش این بالایی بود. مثلا استفاده از 2 حلقه FOR تو در تو ... - اینو میخواید ؟ آخ حسین جان زدی تو خال. من اینو میخام. توی فلوچارت که Merge Sort نداریم. ممنون میشم که تا امشب کمکم کنی. hossein_salehi 29 تير 1386, 19:51void bubblesort(int a[], constint n) { int i,j,t; int switched=1; for(i=n-1;i>0 && switched;i--) { switched=0; for(j=0;j<i;j++) if(a[j]>a[j+1]) { switched=1; t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } hossein_salehi 29 تير 1386, 20:28#include <stdlib.h> #include <stdio.h> #include <time.h> #define ARRAY_SIZE 20 void print_array(int *array) { int x; for(x = 0; x < ARRAY_SIZE; x++) { if(x != ARRAY_SIZE-1) fprintf(stdout, "%d, ", array[x]); else fprintf(stdout, "%d ", array[x]); } } int main() { int iarray[ARRAY_SIZE]; int x, y, holder; // Seed rand() srand((unsigned int)time(NULL)); for(x = 0; x < ARRAY_SIZE; x++) iarray[x] = (int)(rand() % 100); fprintf(stdout, "Before Sort --------------- "); print_array(iarray); // Bubble sort method. for(x = 0; x < ARRAY_SIZE; x++) for(y = 0; y < ARRAY_SIZE-1; y++) if(iarray[y] > iarray[y+1]) { holder = iarray[y+1]; iarray[y+1] = iarray[y]; iarray[y] = holder; } fprintf(stdout, " After Sort --------------- "); print_array(iarray); } pilevar 29 تير 1386, 20:37:sad: این جور چیزی رو نمیخاستم. بیخیال. hossein_salehi 29 تير 1386, 21:12از روی همون کد ،فلوشچارتشو در میارم. یا علی کدتونم = یه چیز ساده ای هست - چرا اینقدر میپیچونیدش عزیز ؟ pilevar 31 تير 1386, 16:11عزیز منظور من این بود که n عدد رو از کاربر بگیره. یعنی خود کاربر اول بزنه 5. 5 تا از اون عدد بگیره و اونا رو مرتب بچینه پشت سر هم(به صورت سعودی) برنامه شما خودش عددی رو انتخاب میکرد. ولی ممنون چیز باحالی بود. اون قضیش اصلا به کلی بیخیالش شدم.
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 505]