PDA

View Full Version : Bài tập C Sắp xếp dãy số theo thứ tự tăng dần trong C?



vietphuc91
17-11-2010, 05:09 PM
lập chương trình thực hiện các công việc sau:
a.nhấp một dãy n số bất kỳ vào một mảng,với n<=10 nhập từ bàn phím
b.sắp xếp dãy số nhập theo thứ tự tăng dần,đưa kết quả ra màn hình.
c.sắp xếp dãy số đã nhập theo thứ tự giảm dần,đưa kết quả ra màn hình
d.sắp xếp dãy số giảm dần theo giá trị tuyệt đối,đưa kết quả ra màn hình
mọi người giúp e nha.cảm ơn nhiều

Doreamon9x
17-11-2010, 05:47 PM
Những bài này là những bài cơ bản .Bạn hãy cố gắng suy nghĩ và viết code đưa lên topic. rồi mọi người sẽ giúp.

programmingvietnam
17-11-2010, 07:57 PM
Dùng sắp xếp tráo đổi đi

void trao_doi(int *a,int*b){
int tam;
tam=*a;
*a=*b;
*b=tam;
}

kitti
17-11-2010, 08:42 PM
tặng bạn code sắp sếp tăng dần. còn lại bạn tự làm nha!

#include <stdio.h>
#include <conio.h>
void main()
{
int a[100], i, j, n, temp;

printf("Nhap so phan tu:");
scanf("%d",&n);
for (i=0;i<n;i++)
{
printf("\nNhap a[%d]=",i);
scanf("%d",&a[i]);
}
printf("\n");
for (i = 0; i < n; i++) printf("%d ",a[i]);

for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
{
if (a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
for (j=0; j<n; j++) printf("\n %d ",a[j]);
getch();
}

vietphuc91
17-11-2010, 10:54 PM
cảm ơn mọi người

vietphuc91
17-11-2010, 10:58 PM
giờ mới biết thầy của em không hề khó tính một chút nào khi yêu cầu cao ở khoản trình bày.Trình bày lung tung đúng là không dễ cho cả mình và người khác soát lỗi.:(.sửa thui

vietphuc91
17-11-2010, 11:09 PM
nhưng tại sao lại for (j=0; j<i; j++) printf("\n %d ",a[j]);
tại sao nếu for (i = 0; i < n; i++) printf("%d ",a[i]);
thì kết quả lại sai:(

quyen1991
17-11-2010, 11:24 PM
cậu ơi trên điễn đàn này thì kiểu bài thế này rất.............rất nhiều
cậu chịu khỏ tìm và code đi
cái ABS thì dùng trong math.h rồi đùng lịnh if và so sánh nha
chúc cậu thành công

vietphuc91
17-11-2010, 11:31 PM
đồng ý là các bài khác làm hoàn toàn tương tự .Nhưng bạn ơi tại sao lại phải for (j=0; j<i; j++) printf("\n %d ",a[j]);mình chưa hiểu for này ntn

quyen1991
17-11-2010, 11:38 PM
thực ra cái này là hàm sắp xếp một mảng tăng dần
để sắp xếp thì mình dùng mảng ảo
tức a[j] đó
cậu cho nó hoán đổi vj trí từ BPhuj sang một A[i] rồi tư a[i] sang A[j] rồi từ A[j] sang Bphu
chỉ có thế thôi
khi xuất ra cậu cần xuất mảng a[i] đã sắp xếp
cậu dùng lệnh
for ( i = 0 l; i < n ; i++)
printf(" %2d",a[i]);
là được

vietphuc91
17-11-2010, 11:59 PM
hi.hóa ra lệnh printf thiếu %d nên in sai.cảm ơn bạn nhiều

khoaimon
18-11-2010, 12:10 AM
không đúng
for (j=0; j<i; j++)
tớ thấy nó lỗi ở chỗ vòng lặp for cuối cùng. Bạn xem lại đi.

vietphuc91
18-11-2010, 11:50 AM
mình copy nguyên code của anh ấy và chạy được.
Mình dùng vòng for(i=1;i<n;i++)

kitti
18-11-2010, 06:25 PM
sory cả nhà mình nhầm sửa lại rồi:
for(j = 0; j < n; j++)

jimhawkins
19-11-2010, 09:57 AM
Bài của titi nếu mà nhập số trùng nhau thì nó vẫn in hết ra chứ nó không lấy 1 sô duy nhất

vietphuc91
19-11-2010, 10:35 AM
đúng là in ra hết.vâyk bài của bạn như thế nào.

boyalone
19-11-2010, 10:52 AM
Nếu là mảng 2 chiều thì làm thế nào để tính tổng của 1 hàng hoặc 1 cột??? So sánh các tổng đó với nhau?

clamvn
19-11-2010, 04:14 PM
Chơi cái này cho xịn
http://vi.wikipedia.org/wiki/S%E1%BA%AFp_x%E1%BA%BFp_nhanh

c_newbie
16-12-2010, 01:03 PM
tặng bạn code sắp sếp tăng dần. còn lại bạn tự làm nha!

#include <stdio.h>
#include <conio.h>
void main()
{
int a[100], i, j, n, temp;

printf("Nhap so phan tu:");
scanf("%d",&n);
for (i=0;i<n;i++)
{
printf("\nNhap a[%d]=",i);
scanf("%d",&a[i]);
}
printf("\n");
for (i = 0; i < n; i++) printf("%d ",a[i]);

for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
{
if (a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
for (j=0; j<n; j++) printf("\n %d ",a[j]);
getch();
}

Anh có thể giải thích giúp em ở đoạn này không ạ?



for (i = 0; i < n; i++) printf("%d ",a[i]);

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


mệnh đề điều kiện và vai trò của biến temp? Anh có thể giải thích giúp em chi tiết được không ạ?

birthis
16-12-2010, 04:02 PM
Đây là thuật toán nổi bọt, người ta đề nghị bỏ không dạy cái này, vì thời gian tính lớn. Dùng sắp xếp chọn đi:

/*
Ten ham : Selection_Sort
Muc dich: Sap xep tang dan danh sach list bang giai thuat sap xep chon
Dau vao : - Danh sach list
- So phan tu cua danh sach n
Dau ra : - Danh sach list da duoc sap xep
*/
void Selection_Sort(float* list,int n){
int k;
for(int i=0; i<n-1;++i){
k = i;
//Tim vi tri phan tu nho nhat tren doan tu i->n
for(int j=i; j<n;++j){
if(list[k]>list[j]) k = j;
}
//Dao vi tri phan tu do voi voi phan tu i
if (k != i){
float tmp = list[k];
list[k] = list[i];
list[i] = tmp;
}
}
}
Còn muốn sắp xếp nhanh thì có đây:

/*
Ten ham : Quick_Sort
Muc dich: Sap xep tang dan danh sach list bang giai thuat sap xep nhanh
Dau vao : - Danh sach list
- So phan tu cua danh sach n
Dau ra : - Danh sach list da duoc sap xep
*/
void Quick_Sort(float* list,int left,int right){
int pivot;
if(left<right){
pivot=Partition(list,left,right);
Quick_Sort(list,left,pivot-1);
Quick_Sort(list,pivot+1,right);
}
}
/*
Ten ham : Partition
Muc dich: Phan doan va chon ra phan tu chot cua day tu left den right cua list
Dau vao : - Danh sach list
- Vi tri bat dau: left
- Vi tri ket thuc: right
Dau ra : - Danh sach list tu left den right da duoc phan doan. Cac phan tu
khong lon hon hon phan tu chot nam ben trai phan tu chot,cac
phan tu khong nho hon phan tu chot nam ben phai phan tu chot.
- Tra ve vi tri phan tu chot
*/
int Partition(float* list,int left,int right){
int i,j;
float pivot;
i = left;
j = right+1;
pivot = list[left];

while(i<j){
++i;
while((i<=right) && (list[i]<pivot)) ++i;
--j;
while((j>=left) && (list[j]>pivot)) --j;
//Hoan doi list[i] voi list[j]
float tmp = list[j];
list[j] = list[i];
list[i] = tmp;
}
swap(list[i],list[j]);
swap(list[j],list[left]);
return j;
}
Còn đây là các chương trình test các giải thuật sắp xếp. Nếu bạn muốn tham khảo.Y(:D

tuanc++
16-12-2010, 04:14 PM
#include <iostream.h>

void NhapMang(int *a, int &n){
cout << "Nhap N = "; cin >> n;
for (int i = 0; i < n ; i ++){
cout << "a[" << i << "] = ";
cin >> a[i];
}
}

void SapXep_TangDan(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 tg = a[i];
a[i] = a[j];
a[j] = tg;
}

tuanc++
16-12-2010, 04:18 PM
#include <iostream.h>

void NhapMang(int *a, int &n){
cout << "Nhap N = "; cin >> n;
for (int i = 0; i < n ; i ++){
cout << "a[" << i << "] = ";
cin >> a[i];
}
}

void SapXep_TangDan(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 tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}

snake_programmer
16-12-2010, 04:26 PM
Đây là thuật toán sắp xếp nổi bọt bạn à ><. Bạn phải hiểu bản chất của nó thì sẽ giải thích được tại sao vòng for nó lại như vậy. Với mọi người thì đây là thuật toán dễ nhớ nhất và dễ viết nhất. Bạn nên kím tài liệu về cấu trúc dữ liệu và giải thuật về đọc.

allvalk
23-11-2011, 10:10 PM
tiện đg làm bài thực hành code cho bạn luôn ^^ chắc cũng học bk rồi:

#include <conio.h>
#include <stdio.h>
#include <math.h>
void hoanvi(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
main()
{int i,j,k;
int a[10],n;
printf("\n nhap so phan tu: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("\n nhap so thu %d",i+1);
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(a[i]>=a[j])
{
hoanvi(&a[i],&a[j]);
}
}
printf("\n day sap xep tang dan: ");
for(j=0;j<n;j++)

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

for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(a[i]<=a[j])
hoanvi(&a[i],&a[j]);
}
printf("\n day sap xep giam dan: ");
for(i=0;i<n;i++)
printf("\t %d",a[i]);
for(i=0;i<n;i++)
{
a[i]=fabs(a[i]);
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(a[i]<=a[j])
hoanvi(&a[i],&a[j]);
}
printf("\n day sap xep giam dan theo gia tri tuyet doi : ");
for(j=0;j<n;j++)
printf("\t %d",a[j]);
getch();
}
mình code k chuyên lắm nên đáng lẽ sửa cho bạn dễ nhìn nhưng cũng lười quá,thông cảm nha

prince-huy
24-11-2011, 09:28 PM
những bài này thì hỏi làm gì...tài liệu cả đống mà