View Full Version : مشکلی در کد الگوریتم sort merge
paradise_human
پنج شنبه 19 اسفند 1389, 10:19 صبح
سلام دوستان ...
کد من کجاش ایراد داره ؟
در خروجی اعداد عجیب غریب چاپ میکنه...
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
int i,j,m,n,s,k,*a,*c;
void merge(int,int,int*,int*);
void merge_sort(int s,int n,int *a,int*c)
{
m=(n-s)/2;
if(n<s)
{
merge_sort(s,m,a,c);
merge_sort(m+1,n,a,c);
merge(s,n,a,c);
}
}
void merge(int s,int n,int*a,int*c)
{
while(i<n&&j<n)
{
if(a[i]<a[j])
{
c[k]=a[j];
j++;
k++;
}
else
{
c[k]=a[i];
i++;
k++;
}
}
while(j<n)
{
c[k]=a[j];
j++;
k++;
}
while(i<n)
{
c[k]=a[j];
j++;
k++;
}
}
void main()
{
cin>>n;
a=new int [n];
c=new int [n];
s=0;
for(i=0;i<n;i++)
cin>>a[i];
merge_sort(s,n,a,c);
for(i=0;i<n;i++);
cout<<c[i];
}
FastCode
پنج شنبه 19 اسفند 1389, 12:54 عصر
خط ۴۳ و ۴۴ باید j رو بکنی i
paradise_human
پنج شنبه 19 اسفند 1389, 12:58 عصر
این کارو انجام دادم ولی باز مشکل حل نشد....
FastCode
پنج شنبه 19 اسفند 1389, 18:52 عصر
جای این دو تا حلقه رو هم باید عوض کنی.
دفعه اول ندیدم.
while(j<n)
{
c[k]=a[j];
j++;
k++;
}
while(i<n)
{
c[k]=a[j];
j++;
k++;
}
paradise_human
پنج شنبه 19 اسفند 1389, 19:36 عصر
بازم مشکلش رفع نشد!!!
FastCode
جمعه 20 اسفند 1389, 02:19 صبح
من دیگه حوصله ندارم.
این یک مثال C# ه.
private static void mergeSort(ref MyType[] d)
{
int n = d.Length;
switch(n)
{
case 2:
if (d[0]._C_ID > d[1]._C_ID)
{
MyType r = d[0];
d[0] = d[1];
d[1] = r;
}
break;
case 3:
if (d[0]._C_ID > d[1]._C_ID)
{
MyType r = d[0];
d[0] = d[1];
d[1] = r;
}
if (d[1]._C_ID > d[2]._C_ID)
{
MyType r = d[1];
d[1] = d[2];
d[2] = r;
if (d[0]._C_ID > d[1]._C_ID)
{
MyType r_ = d[0];
d[0] = d[1];
d[1] = r_;
}
}
break;
default:
int i;
int j = 0;
int k = 0;
int Half1 = n >> 1;
int Half2 = n - Half1;
MyType[] arr1 = new MyType[Half1];
MyType[] arr2 = new MyType[Half2];
j = 0;
for (i = 0; i != Half1; i++) arr1[i] = d[j++];
for (i = 0; i != Half2; i++) arr2[i] = d[j++];
mergeSort(ref arr1);
mergeSort(ref arr2);
i = j = 0;
while (Half1 != j && Half2 != k) if (arr1[j]._C_ID <= arr2[k]._C_ID) d[i++] = arr1[j++]; else d[i++] = arr2[k++];
while (Half1 != j) d[i++] = arr1[j++];
while (Half2 != k) d[i++] = arr2[k++];
break;
}
}
با پردازش
O(N Log N)
و مموری
O(N((Log N)-2))
amir.bakhtiari
چهارشنبه 25 اسفند 1389, 11:47 صبح
سلام این کد کامل:
منبع درست بوده<------------
#include <iostream>
#include <conio.h>
using std::cout;
using std::endl;
using std::cin;
int a[50];
void merge(int,int,int);
void merge_sort(int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
merge_sort(low,mid);
merge_sort(mid+1,high);
merge(low,mid,high);
}
}
void merge(int low,int mid,int high)
{
int h,i,j,b[50],k;
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];
}
int main()
{
int num,i;
cout<<"Hello"<<endl;
cout<<"************************************************** ******************************"<<endl;
cout<<" MERGE SORT PROGRAM "<<endl;
cout<<"************************************************** ******************************"<<endl;
cout<<endl<<endl;
cout<<"Please Enter THE NUMBER OF ELEMENTS you want to sort [THEN PRESS ENTER]:"<<endl;
cin>>num;
cout<<endl;
cout<<"Now, Please Enter the ( "<< num <<" ) numbers (ELEMENTS) [THEN PRESS ENTER]:"<<endl;
for(i=1;i<=num;i++)
{
cin>>a[i] ;
}
merge_sort(1,num);
cout<<endl;
cout<<"So, the sorted list (using MERGE SORT) will be :"<<endl;
cout<<endl<<endl;
for(i=1;i<=num;i++)
cout<<a[i]<<" ";
cout<<endl<<endl<<endl<<endl;
getch();
}
منبع نمیدونم
یا منبع اشتباهه.یا منظورش چیز دیگه ای بوده.یا من سرم خورده به دیوار.
ببخشید!
FastCode
شنبه 06 فروردین 1390, 04:16 صبح
سلام این کد کامل:
/* Merge Sort */
#include<stdio.h>
#include<conio.h>
void MergeSort(array1,n1,array2,n2,array3)
int array1[]; /* First Array containing values to be sorted */
int n1; /* Number of values in the array 1 */
int array2[]; /* Second Array containing values to be sorted */
int n2; /* Number of values in the array 2 */
int array3[]; /* Array to store merge sorted values */
{
int c1=0,c2=0,c3=0;
while(c1<n1&&c2<n2)
{
if(array1[c1]<=array2[c2])
{
array3[c3]=array1[c1];
c1++;
c3++;
}
else
{
array3[c3]=array2[c2];
c2++;
c3++;
}
}
while(c1<n1)
{
array3[c3]=array1[c1];
c1++;
c3++;
}
while(c2<n2)
{
array3[c3]=array2[c2];
c2++;
c3++;
}
}
int main()
{
int array1[100]={0},array2[100]={0},n1=0,n2=0,c,array3[200];
void SelectionSort(int*,int);
textcolor(LIGHTGRAY);
clrscr();
printf("\n");
printf("³ Merge Sort ³\n");
printf("\n");
printf("\nNumber of values in Array 1 ? : ");
scanf("%d",&n1);
printf("\n");
for(c=0;c<n1;c++)
{
printf("Value %2d : ",c+1);
scanf("%d",&array1[c]);
}
printf("\nNumber of values in Array 2 ? : ");
scanf("%d",&n2);
printf("\n");
for(c=0;c<n2;c++)
{
printf("Value %2d : ",c+1);
scanf("%d",&array2[c]);
}
SelectionSort(array1,n1);
SelectionSort(array2,n2);
MergeSort(array1,n1,array2,n2,array3);
printf("\nMerge Sorted Array : ");
textcolor(GREEN);
for(c=0;c<=n1+n2-1;c++)
{
cprintf("%6d ",array3[c]);
}
textcolor(LIGHTGRAY);
getch();
return 0;
}
/* Merge Sort requires the arrays to be sorted */
/* Selection Sort is used to sort the arrays. */
void SelectionSort(array,n)
int array[]; /* Array containing values to be sorted */
int n; /* Number of values in the array */
{
int c,min,i,temp;
for(c=0;c<n;c++)
{
min=c;
for(i=c;i<n;i++)
{
if(array[i]<array[min])
{
min=i;
}
}
temp=array[c];
array[c]=array[min];
array[min]=temp;
}
}
منبع C++ REFRENCE
یا منبع اشتباهه.یا منظورش چیز دیگه ای بوده.یا من سرم خورده به دیوار.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.