PDA

View Full Version : Sắp xếp thứ tự tăng dần trong mảng!



yoyo89312
28-05-2008, 08:46 PM
Mình vừa viết một hàm dùng để sắp xếp thứ tự giảm dần trong mảng int gồm n phần tử, mình chạy thì không báo lỗi nhưng nó lại không chịu sắp xếp.
Các bạn xem giúp mình sai chỗ nào nha. Thank nhiều lắm ^^



void Sort(int a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}

}

Forlorn_hope
28-05-2008, 09:11 PM
Có thể nó không sắp xếp là bởi cậu sử dụng hàm, chỉ là truyền vào một mảng, sắp xếp mảng đó trong hàm chứ cái mảng chính vẫn chưa sắp xếp.
Thử lại với hàm chỉnh lại đôi chút sau:


void Sort(int &a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[i]=tam;
}

}

RadicalLight
28-05-2008, 09:15 PM
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}
}
}

Forlorn_hope
28-05-2008, 09:19 PM
Có thấy khác gì đâu RadicalLight.
Bài viết như cậu thì lại đụng đến tối ưu rồi. Vì có quá nhiều phép so sánh dư thừa trong vòng lặp thứ 2.

RadicalLight
28-05-2008, 09:23 PM
- Khác chổ "[i]=a[j]; a[j]=tam;"
- Tối ưu thì để "yoyo89312" tự lo ^_^!

yoyo89312
28-05-2008, 09:28 PM
void Sort(int a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}

}


Mình tìm ra chỗ sai rồi mấy bạn, trong vòng lặp for thứ 2, nếu để j=1 thì trong lần lập thứ 2 của vòng for thứ nhất, j lại được gán giá trị = 1 tiếp, như vậy, nó lại so sánh với a[1] nữa nên bị sai. Phải sửa lại là for(int j=i+1;j<n;j++)



void Sort(int a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}

}


Còn của bạn Forlorn_hope, kêu mình thêm void Sort(int &a[], int n), theo mình biết thì mảng đã là con trỏ rồi, nên không cần thêm& để lấy đỉa chỉ nữa, không biết mình nói như vậy có đúng không nữa. Mong các bạn chỉ giáo.

Thank mọi người nhiều lắm.

Forlorn_hope
28-05-2008, 09:32 PM
- Khác chổ "[i]=a[j]; a[j]=tam;"
- Tối ưu thì để "yoyo89312" tự lo ^_^!

Hix, nhầm tí, có lỗi gì đó rùi, ht copy bài cậu yoyo89312 từ trên xuống mà có quá nhiều thay đổi: ở 2 vòng for, a[i]=tam -> khó hiểu

yoyo89312
28-05-2008, 09:34 PM
Hix, nhầm tí, có lỗi gì đó rùi, ht copy bài cậu yoyo89312 từ trên xuống mà có quá nhiều thay đổi: ở 2 vòng for, a[i]=tam -> khó hiểu

Do lúc vừa post xong xem lại thấy sai nên mình sửa lại đó, chắc lúc đó bạn cũng vừa copy nên mới khác nhau.

keobong
29-05-2008, 09:51 PM
các bạn giúp tui ba`i na`y với:nhập va`o một ma trận sau dó xuất ra do`ng na`o có tổng lớn nhất.
thanks !

[ ^__^ ]
29-05-2008, 10:29 PM
bạn ý chỉ sai cai
"&" finish tại đây

xuandinh
21-07-2009, 05:57 PM
minh dang hoc c nhung khi lam bai tap sap xep mang nay minh chay chuong trinh thi viec xap sep lai khong dung . mong cac ban chi ra cho sai cho minh

/* Chuong trinh sap xep mang tang,giam dan */

#include<stdio.h>

#include<conio.h>

void main()

{

int i,j,tg,a[50],n;

printf("\nNhap vao kich thuoc cua mang:");

scanf("%d",&n);

printf("\nNhap vao cac phan tu cua mang:");

for(i=0;i<n;i++)

{

printf("\na[%d]= ",i+1);

scanf("%d",&a[i]);

}

//sap xep mang tang dan.

for(i=0;i<n-1;i++)

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

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}

printf("\nMang sap xep tang dan la:");

for(i=0;i<n;i++)

printf("\t%d",a[i]);

getch();

//mang duoc sap xep gian dan

for(i=0;i<n-1;i++)

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

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}

printf("\nMang sap xep giam dan la:");

for(i=0;i<n;i++)

printf("\t%d",a[i]);

getch();

}

babyhorse
21-07-2009, 07:06 PM
Có ai biết làm bài trên bằng kĩ thuật đệ quy ko?

kinhkong89
17-01-2011, 11:27 PM
cho mình hỏi ở bài sắp xếp mảng tăng dần trên

//sap xep mang tang dan.

for(i=0;i<n-1;i++) =========> câu lệnh này có nghĩa gì, sao lại phải là n-1 mà ko phải n

for(j=i+1;j<n;j++) =========> j= i+1 là phần tử liền sau phần tử i đúng ko?

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}
thanks

Wazi Armstrong
17-01-2011, 11:35 PM
Có thể nó không sắp xếp là bởi cậu sử dụng hàm, chỉ là truyền vào một mảng, sắp xếp mảng đó trong hàm chứ cái mảng chính vẫn chưa sắp xếp.


Sai rồi. Truyền mảng là truyền địa chỉ. Nếu mảng truyền vào và được sắp xếp trong hàm thì sau khi ra khỏi hàm mảng đó vẫn được sắp xếp

Asakura Yoh
18-01-2011, 12:34 AM
minh dang hoc c nhung khi lam bai tap sap xep mang nay minh chay chuong trinh thi viec xap sep lai khong dung . mong cac ban chi ra cho sai cho minh
/* Chuong trinh sap xep mang tang,giam dan */

#include<stdio.h>

#include<conio.h>

void main()

{

int i,j,tg,a[50],n;

printf("\nNhap vao kich thuoc cua mang:");

scanf("%d",&n);

printf("\nNhap vao cac phan tu cua mang:");

for(i=0;i<n;i++)

{

printf("\na[%d]= ",i+1);

scanf("%d",&a[i]);

}

//sap xep mang tang dan.

for(i=0;i<n-1;i++)

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

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}

printf("\nMang sap xep tang dan la:");

for(i=0;i<n;i++)

printf("\t%d",a[i]);

getch();

//mang duoc sap xep gian dan

for(i=0;i<n-1;i++)

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

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}

printf("\nMang sap xep giam dan la:");

for(i=0;i<n;i++)

printf("\t%d",a[i]);

getch();

}


Bạn hãy thử tách bài này thành 2 bài tăng giảm riêng thử xem!

xuyenit55
18-01-2011, 02:34 AM
@xuandinh: bài của bạn đây


#include<stdio.h>
#include<conio.h>
//using namespace std;

void main(){

int i,j,tg,a[50],n;
printf("\nNhap vao kich thuoc cua mang:");
scanf("%d",&n);
printf("\nNhap vao cac phan tu cua mang:");
for( i = 0 ; i< n ; i++ ){

printf( "\na[%d]= ", i+1 );
scanf ( "%d", &a[i]);
}

//sap xep mang tang
for( i = 0 ; i < n-1; i++ )
for( j = i+1 ; j < n ; j++ )
if( a[i] > a[j] ){
tg = a[i];
a[i] = a[j];
a[j] = tg;

}
printf("\nMang sap xep tang dan la:");
for( i = 0 ; i < n ; i++)
printf("\t%d", a[i]);
//getch();

//mang duoc sap xep gian dan

for( i = 0 ; i < n-1 ; i++)
for( j = i+1 ; j < n ; j++)
if( a[i] < a[j]){ // if ( a[i] > a[j];

int tam = a[i];
a[i] = a[j];
a[j] = tam;

}
printf("\nMang sap xep giam dan la:");
for( i = 0 ; i < n ; i++)
printf("\t%d",a[i]);
getch();
return 0;

}

jumona
23-01-2011, 10:55 AM
Có ai biết làm bài trên bằng kĩ thuật đệ quy ko?

đệ quy hả? chính là QuickSort đó :D:D

kinhkong89
14-02-2011, 10:52 AM
mình có bài sắp xếp mảng số, nhưng đoạn code hơi khác 1 chút ở i ,j ko biết có đúng ko, ai giải thích giùm mình với,:)

1.Mảng tăng dần:
for(i=n;i>1;i--)
for(j=0;j<i-1;j++)
if(a[j]>a[j+1])
{int t=a[j];a[j]=a[i];a[i]=t}

kinhkong89
14-02-2011, 10:57 AM
mình đã chạy thử và thấy vẫn đúng, sao lại thế nhỉ

nguoirung1.6
14-02-2011, 08:22 PM
cho mình hỏi ở bài sắp xếp mảng tăng dần trên

//sap xep mang tang dan.

for(i=0;i<n-1;i++) =========> câu lệnh này có nghĩa gì, sao lại phải là n-1 mà ko phải n

for(j=i+1;j<n;j++) =========> j= i+1 là phần tử liền sau phần tử i đúng ko?

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}
thanks

for(i=0;i<n-1;i++) =========> câu lệnh này có nghĩa gì, sao lại phải là n-1 mà ko phải n
Câu này duyệt mảng tử đầu(phần tử 0) đến phần tử gần cuối (n-1), nếu đến n cũng được nhưng làm cho thuật toán mất đi tính tối ưu. Vi thuật toán sắp xếp này là so sánh 2 phần tử gần nhau với nhau(phần tử i với i+1) nếu trong vòng for đầu mà chạy đến n (i=n) thì làm gì còn phần tử sau n nữa mà so sánh :D.
for(j=i+1;j<n;j++) =========> j= i+1 là phần tử liền sau phần tử i đúng ko? cái này thì đương nhiên là j=i+1 rồi (:#).
if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}
Cái này là thực hiện so sánh vào đổi chỗ thôi, muốn hiểu dõ nó đổi chỗ thế nào thì bạn nên chạy thử bằng tay đi nha.

beautifulsoul84hung
14-02-2011, 09:58 PM
xem thu bai nay cua minh



#include<stdio.h>
#include<conio.h>
#include<malloc.h>
int hoanvi(int *a, int *b);
int main()
{
int i, j, *a, n;
printf("Nhap so phan tu cua mang: ");
scanf("%d", &n);
a=(int*)malloc(sizeof(int)*n);
for(i=0; i<n; i++){
printf("\nPhan tu thu %d la: ", i+1);
scanf("%d", &a[i]);
}
for(i=0; i<n; i++)
for(j=i+1; j<n; j++){
if(a[i]>a[j])
hoanvi(&a[i], &a[j]);
}
for(i=0; i<n; i++){
printf("%d", a[i]);
if((i+1)%8==0)
printf("\n");
}
getch();
return 0;
}
int hoanvi(int *a, int*b)
{
int tam;
tam=*a;
*a=*b;
*b=tam;
return 0;
}

meo_mop90
14-02-2011, 11:33 PM
đệ quy hả? chính là QuickSort đó :D:D
Mời tham khảo nhé. Qsort :

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

#define MAX 10
int mang[MAX];

void in_mang(int *mang)
{
int i;
for (i=0; i<MAX; i++)
printf("%d ", mang[i]);
}

void sort(int l, int r)
{
int i, j, x, w;
i = l;
j = r;
x = mang[(l+r)/2];
do {
while (mang[i] < x)
i++;
while (x < mang[j])
j--;
if (i <= j)
{
w = mang[i];
mang[i] = mang[j];
mang[j] = w;
i++;
j--;
}
} while (i<=j);
if (l < j)
sort(l, j);
if (i < r)
sort(i, r);
}

void quicksort()
{
sort(0, MAX-1);
}

void main()
{
int i;

randomize(); // tao mang ngau nhien
for (i=0; i<MAX; i++)
mang[i] = random(100);
printf("\nTruoc khi sap : ");
in_mang(mang);
quicksort();
printf("\nSau khi sap : ");
in_mang(mang);
getch();
}

meo_mop90
14-02-2011, 11:42 PM
Bài bạn chỉ là sắp xếp phần tử theo thứ tự tăng dần ( dùng con trỏ ) Chạy ngon lành :D, mình chỉ chú thích tí thôi cho dễ hiểu:

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
int hoanvi(int *a, int *b);
int main()
{
int i, j, *a, n;
printf("Nhap so phan tu cua mang: ");
scanf("%d", &n);
a=(int*)malloc(sizeof(int)*n); //cap phat o nho cho bien con tro a;
for(i=0; i<n; i++){
printf("\nPhan tu thu %d la: ", i+1);
scanf("%d", &a[i]);
}

// sap xep tang dan

for(i=0; i<n; i++)
for(j=i+1; j<n; j++){
if(a[i]>a[j])
hoanvi(&a[i], &a[j]);
}


// in phan tu

for(i=0; i<n; i++){
printf("%d ", a[i]);
if((i+1)%8==0) // toi phan tu thu 8 thi xuong dong
printf("\n");
}
getch();
return 0;
}

int hoanvi(int *a, int *b)
{
int tam;
tam=*a;
*a=*b;
*b=tam;
return 0;
}

khacphuctran
05-03-2011, 03:48 PM
void swap(int &a, int &b)
{
int tam=a;
a=b;
b=tam;
}
void Soft(int a[], n)
{
for(int i=0; i<n; i++)
{
for(int j=i+1; j<=n; j++)
{
if(a[i]>a[j])
{
soft(a[i],a[j]);
}

}
}
}
vậy thôi

fithou91192
09-03-2011, 05:34 AM
minh dang hoc c nhung khi lam bai tap sap xep mang nay minh chay chuong trinh thi viec xap sep lai khong dung . mong cac ban chi ra cho sai cho minh

/* Chuong trinh sap xep mang tang,giam dan */

#include<stdio.h>

#include<conio.h>

void main()

{

int i,j,tg,a[50],n;

printf("\nNhap vao kich thuoc cua mang:");

scanf("%d",&n);

printf("\nNhap vao cac phan tu cua mang:");

for(i=0;i<n;i++)

{

printf("\na[%d]= ",i+1);

scanf("%d",&a[i]);

}

//sap xep mang tang dan.

for(i=0;i<n-1;i++)

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

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}

printf("\nMang sap xep tang dan la:");

for(i=0;i<n;i++)

printf("\t%d",a[i]);

getch();

//mang duoc sap xep gian dan

for(i=0;i<n-1;i++)

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

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}

printf("\nMang sap xep giam dan la:");

for(i=0;i<n;i++)

printf("\t%d",a[i]);

getch();

}

bạn sai điều kiện cho if ở phần giảm dần rồi phải là if(a[i]<a[j]) thì mới đúng[:-X)

xuyenit55
09-03-2011, 08:29 AM
bạn sai điều kiện cho if ở phần giảm dần rồi phải là if(a[i]<a[j]) thì mới đúng[:-X)

sai điều kiện ở phần sắp xếp tăng dần , phải là:

a[i] < a[j]

first_pace
09-03-2011, 08:34 AM
Có thể nó không sắp xếp là bởi cậu sử dụng hàm, chỉ là truyền vào một mảng, sắp xếp mảng đó trong hàm chứ cái mảng chính vẫn chưa sắp xếp.
Thử lại với hàm chỉnh lại đôi chút sau:


void Sort(int &a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[i]=tam;
}

}


Lỗi ở chỗ này bạn ạ, cái bôi đỏ ấy:

int tam=a[i]; a[i]=a[j]; a[i]=tam
chỉnh lại i thành j:

int tam=a[i]; a[i]=a[j]; a[j]=tam;

first_pace
09-03-2011, 08:41 AM
Có thể nó không sắp xếp là bởi cậu sử dụng hàm, chỉ là truyền vào một mảng, sắp xếp mảng đó trong hàm chứ cái mảng chính vẫn chưa sắp xếp.
Thử lại với hàm chỉnh lại đôi chút sau:


void Sort(int &a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[i]=tam;
}

}


Mảng là một con trỏ rồi, truyền mảng cho hàm thì nó chỉ truyền địa chỉ phần tử đầu tiên của mảng, còn hàm tự động mò đến địa chỉ đó mà thao tác trực tiếp trên mảng. Vì vậy mọi biến đổi xảy ra trong hàm đều vẫn có tác dụng sau khi hàm kết thúc. Bạn xem lại truyền theo tham trị (pass by value) và truyền theo tham chiếu (pass by reference with pointer) nhé.

first_pace
09-03-2011, 08:48 AM
Mình vừa viết một hàm dùng để sắp xếp thứ tự giảm dần trong mảng int gồm n phần tử, mình chạy thì không báo lỗi nhưng nó lại không chịu sắp xếp.
Các bạn xem giúp mình sai chỗ nào nha. Thank nhiều lắm ^^



void Sort(int a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}

}


cái chỗ bôi đỏ ấy. phải sửa lại thành

for(int j=i+1;j<n;j++)
Bạn này quên cả bubble sort nữa (:)) Mà bạn dùng thuật toán này làm gì. Nó là cái thằng tệ nhất trong mấy thằng O(n^2) đấy

soldtheworld
09-03-2011, 09:34 AM
Mình vừa viết một hàm dùng để sắp xếp thứ tự giảm dần trong mảng int gồm n phần tử, mình chạy thì không báo lỗi nhưng nó lại không chịu sắp xếp.
Các bạn xem giúp mình sai chỗ nào nha. Thank nhiều lắm ^^



void Sort(int a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}

}



Cậu viết như thế này chạy không đúng là chắc chắn rồi.
Cậu chỉ cần thay lệnh for(int j=1;j<n;j++) bởi lệnh for(int j=i+1;j<n;j++) là ok luôn. Chúc thành công.

soldtheworld
09-03-2011, 09:36 AM
cho mình hỏi ở bài sắp xếp mảng tăng dần trên

//sap xep mang tang dan.

for(i=0;i<n-1;i++) =========> câu lệnh này có nghĩa gì, sao lại phải là n-1 mà ko phải n

for(j=i+1;j<n;j++) =========> j= i+1 là phần tử liền sau phần tử i đúng ko?

if(a[i]>a[j])

{

tg=a[i];

a[i]=a[j];

a[j]=tg;

}
thanks

Đây là thuật toán đổi chỗ trực tiếp (Interchange_sort), cậu tìm thuật toán này đọc là hiểu ngay thôi mà.

akiller12
22-05-2013, 11:31 PM
void Sort(int a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}

}
Mình vẫn ko hiểu cái chỗ

int tam=a[i]; a[i]=a[j]; a[j]=tam;
ai giải thích giúp với mình dốt quá :(

prog10
23-05-2013, 12:10 AM
ai giải thích giúp với mình dốt quá :(
Chạy tay thôi.
p/s: code đó sai bét.

akiller12
23-05-2013, 12:11 AM
là sao hả bạn bạn giải thích đc ko

prog10
23-05-2013, 12:12 AM
là sao hả bạn bạn giải thích đc ko
Thay số vào a[i] và a[j], rồi làm y chang xem nó ra thế nào -> chạy tay :)
Mà code này sai bét.

akiller12
23-05-2013, 12:17 AM
Thay số vào a[i] và a[j], rồi làm y chang xem nó ra thế nào -> chạy tay :)
Mà code này sai bét.

Nói chung t vẫn ko hiểu rõ nó sắp xếp cái j nữa dốt quá . Ví dụ a[1]=2 còn a[2] = 3 thì tam =2 ; 2=3 à (:-)?? chỉ giáo cặn kẽ đc ko thank bạn :D

prog10
23-05-2013, 01:22 AM
Nói chung t vẫn ko hiểu rõ nó sắp xếp cái j nữa dốt quá . Ví dụ a[1]=2 còn a[2] = 3 thì tam =2 ; 2=3 à (:-)?? chỉ giáo cặn kẽ đc ko thank bạn :D
Cứ nghĩ là bạn ko hiểu cách swap chứ :|
Mà bạn học ngành gì thế?

akiller12
23-05-2013, 09:04 AM
Cứ nghĩ là bạn ko hiểu cách swap chứ :|
Mà bạn học ngành gì thế?

Hớ hớ mới học CNTT . Bạn giải thích với chả hiểu j

GaTrongMatSat
06-06-2013, 10:03 AM
Mình vừa viết một hàm dùng để sắp xếp thứ tự giảm dần trong mảng int gồm n phần tử, mình chạy thì không báo lỗi nhưng nó lại không chịu sắp xếp.
Các bạn xem giúp mình sai chỗ nào nha. Thank nhiều lắm ^^



void Sort(int a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=1;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}

}


void Sort(int a[], int n)
{
for(int i=0;i<n-1;i++)
for(int j=i;j<n;j++)
if(a[i]<a[j])
{
int tam=a[i]; a[i]=a[j]; a[j]=tam;
}

}