Tải bản đầy đủ (.doc) (7 trang)

Bài toán sắp xếp pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (217.03 KB, 7 trang )

 Bài toán sắp xếp
Sắp xếp(sorting)
Sắp xếp một danh sách các đối tượng theo một thứ tự nào đó là một bài toán thường
được vận dụng trong các ứng dụng tin học. Ví dụ ta cần sắp xếp danh sách thí sinh theo
tên với thứ tự abet, hoặc sắp xếp danh sách sinh viên theo điểm trung bình với thứ tự từ
cao đến thấp.Một ví dụ khác là trong bài tìm số lớn thứ k,việc sắp xếp mảng theo thứ tự
giảm dần khiến cho bài toán trở nên đơn giản hơn nhiều.
Tóm lại sắp xếp là một yêu cầu không thể thiếu và là một bài toán cơ bản.Do đó việc
nghiên cứu các phương pháp sắp xếp là rất cần thiết để vận dụng trong khi lập trình.
Các phương pháp sắp xếp đơn giản:
1.Sắp xếp chọn(selection sort):
_Random__________Gần như đã sắp xếp__Đảo ngược__________Trùng lặp
Ðây là phương pháp sắp xếp đơn giản nhất được tiến hành như sau:
• Ðầu tiên chọn phần tử có khóa nhỏ nhất trong n phần tử từ a[0] đến a[n-1] và hoán vị nó
với phần tử a[0].
• Chọn phần tử có khóa nhỏ nhất trong n-1 phần tử từ a[1] đến a[n-1] và hoán vị nó với
a[1].
• Tổng quát ở bước thứ i, chọn phần tử có khoá nhỏ nhất trong n-i+1 phần tử từ a[i-1] đến
a[n-1] và hoán vị nó với a[i].
• Sau n-1 bước này thì mảng đã được sắp xếp.
Ví dụ: Cho dãy a = (12,2,8,5,1,6,4,15)
12 2 8 5 1 6 4 15
Bước 1: 1 2 8 5 12 6 4 15
Bước 2: 1 2 8 5 12 6 4 15
Bước 3: 1 2 4 5 12 6 8 15
Bước 4: 1 2 4 5 12 6 8 15
Bước 5: 1 2 4 5 6 12 8 15
Bước 6: 1 2 4 5 6 8 12 15
Bước 7: 1 2 4 5 6 8 12 15
Phương pháp này được gọi là phương pháp chọn bởi vì nó lặp lại quá trình chọn phần tử
nhỏ nhất trong số các phần tử chưa được sắp.Nhưng nhược điểm như các bạn thấy trên


hình là tốc độ chạy của nó chậm và cố định, thậm chí với dãy sắp xếp sẵn thì tốc độ
cũng chỉ bằng dãy đảo ngược.
Sau đây là code mẫu:
PHP Code:
int i,j,tmp,pos;
for(i=0;i<n-1;i++)
{
pos=i; //vi tri cua phan tu nho nhat trong n-i phan tu, ban d
au coi la i
for(j=i+1;j<n;j++) if(a[j]<a[pos]) pos=j;
if(pos!=i)
{
tmp=a[pos];
a[pos]=a[i];
a[i]=tmp;
}
}
2.Sắp xếp nổi bọt(Bubble sort):
_Random____________Gần như đã sắp xếp__Đảo ngược__________Trùng lặp
Thuật toán dựa trên việc đổi chỗ 2 phần tử nên còn gọi là sắp xếp đổi chỗ(Exchange
sort).Tưởng tượng thế này:trong quá trình sắp xếp, những cái nhẹ hơn sẽ nổi dần lên
trên.
• Bước 1: Xét các phần tử từ a[n-1] đến a[1], với mỗi phần tử a[j], so sánh khoá của nó
với khoá của phần tử a[j-1] đứng ngay trước nó. Nếu khoá của a[j] nhỏ hơn khoá của a[j-
1] thì hoán đổi a[j] và a[j-1] cho nhau.
• Bước 2: Xét các phần tử từ a[n-1] đến a[2], và làm tương tự như trên.
• Sau n-1 bước thì kết thúc.
Như thế này đây:
PHP Code:
for(i=0;i<n-1;i++)

for(j=n-1;j>i;j )
if(a[j-1]>a[j])
{
tmp = a[j-1];
a[j-1] = a[j];
a[j] = tmp;
}
3.Sắp xếp kiểu chèn(insertion sort):
_Random____________Gần như đã sắp xếp__Đảo ngược__________Trùng lặp
Ý tưởng thuật toán là dựa vào kinh nghiện của những người chơi bài.Khi bốc được lá bài
mới thì họ chèn vào vị trí thích hợp giữa những quân bài khác.
• Bước 1, xen phần tử a[1] vào danh sách đã có thứ tự a[0] sao cho a[0],
a[1] là một danh sách có thứ tự.
• Bước 2, xen phần tử a[2] vào danh sách đã có thứ tự a[0], a[1] sao cho
a[0], a[1], a[2] là một danh sách có thứ tự.
• Tổng quát, bước i, xen phần tử a[i] vào danh sách đã có thứ tự
a[0],a[1], a[i-1] sao cho a[0], a[1], a[i] là một danh sách có thứ tự.
Phần tử đang xét a[j] sẽ được xen vào vị trí thích hợp trong danh sách các phần tử đã
được sắp trước đó a[0],a[1], a[j-1] bằng cách so sánh khoá của a[j] với khoá của a[j-
1] đứng ngay trước nó. Nếu khoá của a[j] nhỏ hơn khoá của a[j-1] thì hoán đổi a[j-1] và
a[j] cho nhau và tiếp tục so sánh khoá của a[j-1] (lúc này a[j-1] chứa nội dung của a[j])
với khoá của a[j-2] đứng ngay trước nó (kiểu hao hao nổi bọt đó!)
Thuật toán này hơi phức tạp hơn 2 thuật toán trên:
PHP Code:
for(i=1;i<n;i++)
{
j=i;
while(j>0 && a[j]<a[j-1])
{
tmp=a[j];

a[j]=a[j-1];
a[j-1]=tmp;
j ;
}
}
Chương trình sau đây cho bạn một cái nhìn trực quan hơn về các thuật toán sắp xếp:
Viewsort 2.0
Đây là bài giải mẫu sắp xếp 1 mảng dùng sắp xếp chọn:
PHP Code:
#include <stdio.h>
#include <conio.h>
void main()
{
int n,i,j,tmp,pos;
clrscr();
printf("Nhap so phan tu:");
scanf("%d",&n);
int*a=new int[n];
//tao mang a va cap phat bo nho du chua n phan tu int
//mang n phan tu danh so tu 0 den n-1
printf("Nhap %d phan tu:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
//Xong nhap
for(i=0;i<n-1;i++)
{
pos=i;
for(j=i+1;j<n;j++) if(a[j]<a[pos]) pos=j;
if(pos!=i)
{

tmp=a[pos];
a[pos]=a[i];
a[i]=tmp;
}
}
//Xong xap xep chon
for(i=0;i<n;i++)
printf("%d ",a[i]);
getch();
}
Còn nhiều thuật toán khác như quick sort,heap sort,merge sort nhưng xét trên độ phức
tạp mình không trình bày ra ở đây.Các bạn có thể tự tìm đọc trong sách.
CÁC CHỦ ĐỀ KHÁC:
• [Tổng hợp] Báo cáo các nhóm 13-5-2009 (13/05/2009)
• Giới thiệu Qt Frameworks (17/01/2010)
• Mức A - Câu [5,6,7,8,9,10] + Mức B - Câu 1 (15/01/2009)
• Mức A - Câu 9: Đổi 1 xâu từ chữ thường thành chữ hoa (15/01/2009)
• Mức C- câu 6 (16/01/2009)
• 2 bài tập về giải thuật (06/05/2009)
• Lex & Yacc - lexer and parser tool for C++ (17/01/2010)
• Cần bài giảng về các thuật toán sắp xếp (27/10/2009)
• Tổng kết về ký tự và xâu ký tự (28/02/2009)
• Mức B - Câu 3: Kiểm tra 1 xâu có chứa xâu khác hay không (15/01/2009)
• Các cấu trúc điều khiển (26/12/2008)
• Tìm số lớn thứ k (26/12/2008)
• Phân biệt pointer và reference (05/12/2009)
• Sơ đồ mối quan hệ giữa các lớp (16/04/2009)
• Bài Toán Quản Lý Tài Khoản ATM (03/06/2009)

Last edited by BQH®; 18-05-2010 at 00:06.

Trả lời Trả lời kèm Trích dẫn Thanks
 Đã có 3 thành viên cảm ơn river_11576 vì bài viết
này:
andy_khanh (05-01-2009), BQH® (27-12-2008), lanhlung90 (04-01-2009)
 22-12-2008 19:17 #2
river_11576
• Xem Hồ sơ
• Xem bài viết diễn đàn
• Tin nhắn riêng
• Thêm vào Danh bạ
Tham gia
Dec 2008
Tuổi
20
Bài viết
1.048
Vàng
10.834,50
Thanks
849/412
Hôm nay học tin lại thu được cái mới, post lên cho ae bùng học tham khảo:
Đây là cải tiến của sắp xếp nổi bọt:
PHP Code:
int i,j,tmp,swap;
for(i=0;i<n-1;i++)
{
swap=0; //so lan doi cho
for(j=n-1;j>i;j )
if(a[j-1]>a[j])
{

swap++;
tmp = a[j-1];
a[j-1] = a[j];
a[j] = tmp;
}
if(swap==0) break;//neu phat hien khong doi cho lan nao thi sap xep
xong, thoat
}

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×