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

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

Đang tải... (xem toàn văn)

Thông tin tài liệu

 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 } .  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. 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. 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

Ngày đăng: 06/07/2014, 20:20

Từ khóa liên quan

Mục lục

  •  Bài toán sắp xếp

    • CÁC CHỦ ĐỀ KHÁC:

    •  Đã có 3 thành viên cảm ơn river_11576 vì bài viết này:

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan