PDA

View Full Version : مشکل در بازگشتی



djnew2009
دوشنبه 08 خرداد 1391, 00:54 صبح
آقا سلام یه برنامه کد زدم که quick sort می کنه
و چون تو الگوریتم از توابع برگشتی استفاده می شه تو برنامم بعد از این که مرتب سازی رو انجام می ده از بازگشتی بیرون نمیاد دیگه موندم لطفا کمک کنید !
C++‎ رو هم می دارم برا ساده تر شدن کار
http://djnew2010.persiangig.com/quick.CPP

http://djnew2010.persiangig.com/quick.asm

ssbostan
دوشنبه 08 خرداد 1391, 19:35 عصر
سلام؛
الگوريتمي كه نوشتيد اصلا به صورت quick چيزي رو مرتب نميكنه، اگر اين quick sort الگوريتم خاصي داره تشريح كنيد تا كمك كنم.

موفق باشيد.

djnew2009
دوشنبه 08 خرداد 1391, 20:07 عصر
سلام؛
الگوريتمي كه نوشتيد اصلا به صورت quick چيزي رو مرتب نميكنه، اگر اين quick sort الگوريتم خاصي داره تشريح كنيد تا كمك كنم.

موفق باشيد.

ممنون از کمکتون یه کم بیشتر باید دقت می کردید مرتب سازی رو انجام میده ولی تو بازگشتی گیر می کنه
راحتر بگم وقتی که می خواد ret بکنه مسلما باید ip رو هم pop کنه این کار رو انجام می ده اما آخرای کار که
آرایه مرتب میشه می خواد stack رو خالی کنه گیر می افته هر دفعه بی خودی یه چیز جدیدیو Push می کنه
هنوز run نکردم آرایه نزولی
87594
بعد از run کردن ارایه مرتب شد ولی هنوز stop نشده همون جور داره اجرا می کنه


لطفا کمک کنید

ssbostan
دوشنبه 08 خرداد 1391, 20:17 عصر
من كد c تون رو نگاه كردم، لطفا الگوريتم مرتب سازيتون رو تشريح كنيد تا بررسي كنم.

djnew2009
دوشنبه 08 خرداد 1391, 20:40 عصر
داریم عدد 7 1 5 3

عدد 3 رو به عنوان pvi می گیره از 3 به برنامه میاد بررسی می کنه که آیا اعداد بعد از اون 3 کو چکتر اند یا نه
اگه بودند میاد به j یک واحد اضافه می کنه بعد میاد مقدار ( array(j رو با ( array(i جابه جا می کنه
به عبارتی نتیجه میشه
7 5 1 3 و همین طور مثلا به جای 7 بود 2 j رو یه واحد دیگه اضافه می کرد
اونوقت میشد
5 2 1 3
و در بعد از اینکه حلقه بررسی خاتمه پیدا کرد میاد مقدار ( array(j را با ( array(pvi جابه جا می کنه
(pvi در طول اجرا تغییر نمی کنه ) , (j همیشه آخرین ایندکس عددی که کوچکتر از عدد pvi بوده رو داره)
و نتیجه
7 5 3 1
مقداری که این تابع بر می گردونه مقدار j هستش
البته این قسمتی از الگوریتم بود که گفتم(یه تابع به اسم partition) این قسمت داخل یه تابع بازگشتی قرار می گیره
اینم شبه کد: Void partition (index low, index high, index &pivotpoint)
{
index i,j;
keytype pivotitem;
pivotitem = s[low]; // choose first item for pivotitem
j=low;
for (i=low+1;i<=high;i++)
{
if ( s[i] < pivotitem)
{
j++;
exchange s[i] and s[j];
}
}
pivotpoint=j;
exchange s[low] and s[pivotpoint]; // put pivotitem to pivot point
}

Void quicksort ( index low, index high )
{
index pivotpoint;
if (high > low )
{
partition (low,high,pivotpoint);
quicksort (low,pivotpoint-1);
quicksort (pivotpoint+1,high);
}
}

djnew2009
دوشنبه 08 خرداد 1391, 20:49 عصر
کسی نمی دونه مشکل کجاس ؟
با call far مشکلش حل میشه؟

xman_1365_x
سه شنبه 09 خرداد 1391, 02:26 صبح
یک نگاه کلی کردم میشد بهتر نوشتش ، اما در مورد مشکلتون وقتی پیش میاد که آدرس برگشت رو گم میکنه پروسیجر quicksort مشکل داره اولا که مثل کد سی پیاده نشده
میتونستین پارامتر هارو رو پشته بهش بفرستین و شرط هارم درست مینوشیتید ،در مورد مشکلتونم چون تابع مدام خودش رو صدا میکنه و push میکنه آدرس برگشت گم میشه که بعد از بازگشت باید پشته رو تنظیم کنید.
اگر شد بعد میگم چطور تابع بازگشتی بنویسید و پارامتر هارو ارسال کنید ، اما فعلا روی مشکلتون که گفتم فکر کنید ببینید میتونید حلش کنید

موفق باشی

djnew2009
سه شنبه 09 خرداد 1391, 21:36 عصر
سلام هر چی فک کردم دیگه راه حلی به ذهنم نرسید لطفا کمک کنید
زورمو زدم شد این کد
data segment
array db 10,9,8,7,6
temp db 6 dup(?)
data ends
code segment
assume ds:data,cs:code
main:
mov ax,data
mov ds,ax
mov si,0
mov di,4
push si
push di
call quicksort
pop di
pop si
next :cmp si,di
je ex
xor ax,ax
mov al ,[array+si]
mov bx , offset temp
call bintoasc ;tabdile adad sahih be reshte
mov dx,offset temp ;m addresse motaghayere tarif shode too hafeze
mov ah,4
int 21h


inc si
jmp next
ex:mov ah,4ch;exit program .4ch tastor code khateme baranams
int 21h


quicksort proc

nextlh2:cmp si ,di
jge donex
call part
push si
push di
mov di , dx
dec di

call quicksort
pop di
pop si
push si
push di
mov si,dx
inc si
call quicksort
pop di
pop si
jmp nextlh2
donex:

ret
quicksort endp
part proc

push ax
push bx
push cx
push bp ;pvi
push si
push di
xor ax ,ax
xor dx,dx
mov dx,si
mov bp,si
inc si;

nextlh:

cmp si,di
jg conlh

mov bx,bp
mov ah ,byte ptr[array+ bx]
mov bx,si
mov al, byte ptr [array+bx]
cmp al,ah ;val of i <val of pvi
jge conipvi
inc dx ;j++

mov bx,dx ;exchange j val and i val
mov ah,byte ptr[array+ bx]
xchg ah,al
mov byte ptr[array+ bx],ah
mov bx ,si
mov byte ptr[array+ bx],al

conipvi:

inc si
jmp nextlh
conlh: ;j
mov bx,dx
mov ah,byte ptr[array+ bx]

mov bx,bp ;low
mov al,byte ptr[array+ bx]

mov byte ptr [array+bx],ah
mov bx ,dx
mov byte ptr [array+bx],al
pop di
pop si
pop bp
pop cx
pop bx
pop ax
ret
part endp
bintoasc proc
push bx
push cx
push dx
push si
push ax

mov cx,10
mov si,2

next6:cmp ax,0;tooole ro be dast miare adad
je continue
xor dx,dx
div cx
inc si
jmp next6

continue:
pop ax
push ax
add bx,si
mov byte ptr[bx],'$'; be khatere inke adad to taghsim dah makos dar miomad manam
;az akhar adad ro rikhtam to hafeze
dec bx
mov byte ptr[bx],10; ;code 10 ,13 ...code 13 boro khate badd ..code 10 bia aval khat
dec bx
mov byte ptr[bx],13;
dec bx
next5:cmp ax,0
je finish5
xor dx,dx
div cx
add dl,'0' ;'0' khode= assembeler tabdilesh mikone be code ascii
mov [bx],dl
dec bx
jmp next5
finish5:
pop ax
pop si
pop dx
pop cx
pop bx
ret
bintoasc endp


code ends
end main

djnew2009
چهارشنبه 10 خرداد 1391, 19:04 عصر
آقا دم همگیتون گرم!!!!
اشتباهم رو پیدا کردم به خاطر یه بی دقتی کوچولو خواب و روز رو از چشممون گرفته بود
عیبم اونجایی بود که تو quick sort گفته بودم یه حلقه درست کن تا جایی که si از di کم تر بود
برداشتم دیدم جواب داد
مرسی از همگی