PDA

View Full Version : مرتب کردن آرایه



delphi_stu
پنج شنبه 11 خرداد 1385, 18:48 عصر
دوستان کسی می تونه کمکم کنه ؟
میخوام آرایه رو از موقعیت وسط آرایه به سمت دو انتها صعودی یا نزولی مرتب کنم.
ممنون میشم دوستان راهنماییم کنن

once4ever
پنج شنبه 11 خرداد 1385, 19:16 عصر
شما بلدی چجوری یک آرایه رو صعودی نزولی sort کنی؟
اگه بلدی اینم مثل اونه ولی با این تفاوت که برای for نمیگی از اول تا آخر چک کنه بلکه میگی از اول تا وسط چک کنه!

delphi_stu
پنج شنبه 11 خرداد 1385, 21:42 عصر
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

void sort(int* x, int n);
void prnt(int* x, int n);
void arinv(int* x, int n);
void arnop(int* x, int n);
void (*fp)(int* x, int n);

int main(){

const int n=10;
int x[n]={9,5,28,76,2,12,25,40,13,36};
int y[n],i;

i=0;
while(i<n)y[i]=x[i++];
fp=arnop;
sort(y,n);
prnt(y,n);
i=0;
while(i<n)y[i]=x[i++];
fp=arinv;
sort(y,n);
prnt(y,n);
return(0);
}

void sort(int* x, int n){
int i=1, j, t;
while(i<n){
j=i++;
while(j--)
if(x[j]>x[j+1]){
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
else break;
}
fp(x,n);
}

void prnt(int* x, int n){
int i=0;
cout<<"\n";
while(i<n)
printf("%4d",x[i++]);
}

void arinv(int* x, int n){
int i=0, t;
while(i<n/2){
t=x[i];
x[i]=x[n-i-1];
x[n-i-1]=t;
i++;
}
}

void arnop(int* x, int n){
}



در این برنامه چهار تابع تعریف شده که ساختار ورودی و خروجی مشابه دارند. تابع sort آرایة دریافت شده را مرتب می‌کند و سپس اشاره‌گر تابعی عمومی fp را اجرا می نماید که در این برنامه ممکن است به یکی از دو تابع arinv یا arnop اشاره کند. در حالت اول آرایة بدست آمده نزولی و در حالت دوم صعودی مرتب شده خواهند بود.
در همین برنامه میخوام توابعی اضافه کنم (مشابه عملکرد arinv) که بتوان آرایه را به صورت مرتب شده از موقعیت وسط آرایه به سمت دو انتها صعودی یا نزولی بدست آورد.

once4ever
جمعه 12 خرداد 1385, 09:08 صبح
void sort(int* x, int n){
int i=1, j, t;
while(i<n){
j=i++;
while(j--)
if(x[j]>x[j+1]){
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
else break;
}
fp(x,n);
}

به این تابع دقت کن. میره عددهارو یکی یکی چک میکنه و اگه از عدد بعدی بزرگتر بود باهم جابجا میکنه و تا تعداد کل آرایه میره جلو. خوب؟
حالا باید بگی تا نصف تعداد آرایه بره جلو. مثلا:
while(i<n/2){...}
دراینصورت عددهای سمت چپ آرایه بصورت صعودی sort میشن.

delphi_stu
جمعه 12 خرداد 1385, 10:07 صبح
مرسی دوست عزیز

من کد زیر رو نوشتم اما 5 رقم اول رو نزولی چاپ نمیکنه ...
اشکالات کار منو میشه بگی
ممنون میشم

void sort2(int* x, int n){
int i=1, j=6, t;
while(i<n/2){
j=i++;
while(j--)
if(x[j]>x[j+1]){
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
else break;
}
fp(x,i);

i=5;
while(i<n){
j=i++;
while(j--)
if(x[j]>x[j+1]){
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
else break;
}
fp(x,n/2);
}

once4ever
جمعه 12 خرداد 1385, 13:36 عصر
اشتباه نوشتی که!
اولا هردوتا while که نوشتی دارند صعودی بدست میارن (باید while دوم رو درست کنی تا نزولی بدست بیاره)
دوما چرا نوشتی i=5 بجاش بنویس i=n/2+1

delphi_stu
جمعه 12 خرداد 1385, 16:55 عصر
در برنامه گفته شده تابعی مشابه به عملکرد arinv نوشته بشه . اگه من تابع sort رو دست بزنم آیا اشتباهه؟

once4ever
جمعه 12 خرداد 1385, 17:31 عصر
اگه تابع sort رو طوری بنویسی که هم صعودی و هم نزولی بدست بیاره و فقط محدوده اش رو عوض کنی خیلی بهتره تا اینکاری که اینجا کردی!
میخوای صعودی مرتب کنه بعد همه اعضای آرایه رو برعکس کنی؟! که بشه نزولی! جالب نیست.

بنظرم دوتابع sort درست کنی یکی نزولی و یکی صعودی که آرایه و نقطه شروع و نقطه پایان بگیره خیلی بهتره.
خیلی ساده است. موفق باشی ;)

delphi_stu
جمعه 12 خرداد 1385, 20:47 عصر
برنامه رو اینطوری تغییرش دادم ممنون میشم اگه اشکالی هست بهم بگین

#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

void sort(int* x, int n);
void sort2(int* x, int n);
void prnt(int* x, int n);
void arinv(int* x, int n);
void arnop(int* x, int n);
void (*fp)(int* x, int n);

int main(){

const int n=10;
int x[n]={9,5,28,76,2,12,25,40,13,36};
int y[n],i;

i=0;
while(i<n)y[i]=x[i++];
fp=arnop;
sort(y,n);
prnt(y,n);
i=0;
while(i<n)y[i]=x[i++];
fp=arinv;
sort(y,n);
prnt(y,n);
i=0;
while(i<n)y[i]=x[i++];
fp=arinv;
sort2(y,n);
prnt(y,n);


return(0);
}

void sort(int* x, int n){
int i=1, j, t;
while(i<n){
j=i++;
while(j--)
if(x[j]>x[j+1]){
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
else break;
}
fp(x,n);
}
void sort2(int* x, int n){
int i=1, j=6, t;
while(i<n/2){
j=i++;
while(j--)
if(x[j]>x[j+1]){
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
else break;
}
fp(x,n/2);

i=n/2+1;
while(i<n){
j=i++;
while(j--)
if(x[j]<x[j-1]){
t=x[j];
x[j]=x[j-1];
x[j-1]=t;
}
else break;
}
fp(x,n/2);
}
void prnt(int* x, int n){
int i=0;
cout<<"\n";
while(i<n)
printf("%4d",x[i++]);
}

void arinv(int* x, int n){
int i=0, t;
while(i<n/2){
t=x[i];
x[i]=x[n-i-1];
x[n-i-1]=t;
i++;
}
}

void arnop(int* x, int n){
}