ورود

View Full Version : مسئله ساده sort



sa1378
چهارشنبه 18 تیر 1393, 15:32 عصر
سلام
من یه کد جستجوی باینری نوشتم:
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
int size=15;
int a[size];
for(int k=0;k<=14;k++)
{
a[k]=k*5;

}
int key=11;
int low=0;
int high=size-1;
int middle=0;
int result=0;


for(int i=size;i>=1;i--)
{
for(int j=1;j<=i;i++)
{
if(a[j]>a[j-1])
{
int hide=a[j];
a[j]=a[j-1];
a[j-1]=hide;

}
}
}




for(;low<=high;)
{
middle=(low+high)/2;
if(key==a[middle])
{
cout<<"key found in "<<middle<<" array."<<endl;
result=1;
break;
}
else if (key<a[middle])
high=middle-1;

else if (key>a[middle])
low=middle+1 ;

}
if (result==0)
cout<<"key not found"<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}

این کد موقع اجرا چیزی نمایش نمیده
ولی وقتی کد sort رو برمیدارم درست میشه
for(int i=size;i>=1;i--)
{
for(int j=1;j<=i;i++)
{
if(a[j]>a[j-1])
{
int hide=a[j];
a[j]=a[j-1];
a[j-1]=hide;

}
}
}

این از اول آرایه هاش مرتب شده هستن ولی چرا این قسمت مشکل داره؟

مسعود اقدسی فام
چهارشنبه 18 تیر 1393, 15:46 عصر
برای اینکه این کد مرتب‌سازی به صورت نزولی مرتب می‌کنه (بزرگ به کوچک) اما جستجو برای آرایه‌‌ی صعودی (کوچک به بزرگ) نوشته شده.

sa1378
چهارشنبه 18 تیر 1393, 16:04 عصر
مگه فرقی داره؟
اول مرتب سازی داره صورت میگیره و آرایه مرتب میشه

بعد جستجو انجام میشه

مسعود اقدسی فام
چهارشنبه 18 تیر 1393, 20:03 عصر
مگه فرقی داره؟
اول مرتب سازی داره صورت میگیره و آرایه مرتب میشه

بعد جستجو انجام میشه

این کد مرتب‌سازی که نوشتید اعداد یک تا نه رو به این ترتیب مرتب می‌کنه:

9,8,7,6,5,4,3,2,1


فرض کنیم دنبال عدد دو هستیم.
عنصر وسط انتخاب می‌شه که 5 هست. بر اساس کدی که برای جستجو نوشته شده، چون 2 از 5 کوچکتر هست پس بازه‌ی 9 تا 6 رو می‌گرده! اونجا که 2 نداریم.

کد جستجوی شما این فرض رو می‌کنه که اعداد به ترتیب صعودی مرتب هستن. یعنی اینطوری:



1,2,3,4,5,6,7,8,9


که نیستن.

کد مرتب‌سازی خودتون رو اینطور تغییر بدید:


if(a[j]<a[j-1])



البته مستقل از این موضوع کد شما یه اشکال دیگه هم داره که باعث می‌شه حلقه‌ی بی‌نهایت گیر کنه. حلقه‌ی داخلی مرتب‌سازی به جای این که j رو افزایش بدید i را افزایش دادید و j همیشه یک بافی می‌مونه و هیچ وقت از حلقه خارج نمی‌شه.



for(int j=1;j<=i;j++)



این دو تا رو اعمال و امتحان کنید.

sa1378
چهارشنبه 18 تیر 1393, 21:05 عصر
آها
ممنون از کمک