1. Trang chủ
  2. » Công Nghệ Thông Tin

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

7 623 0
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 792 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

 Bài toán sắp xếp Sắp xếpsorting 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

Trang 1

 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

Trang 2

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 , , tmp , pos ;

for( i 0 i n 1 i ++)

{

pos = ; //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 = ;

if( pos != i

{

tmp = [ 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

Trang 3

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ử 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-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 ];

Trang 4

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ự

Trang 5

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], 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-a[j-1] thì hoán đổi a[j-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 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>

{

int n , , , tmp , pos ;

clrscr ();

printf ( "Nhap so phan tu:" );

scanf ( "%d" ,& n );

int * =new int [ ];

//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" , );

for( i 0 i n i ++)

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

//Xong nhap

for( i 0 i n 1 i ++)

{

pos = ;

for( j i 1 j n j ++) if( a j ]< a pos ]) pos = ;

if( pos != i

{

tmp = [ pos ];

a pos ]= a i ];

a i ]= tmp ;

}

}

//Xong xap xep chon

for( i 0 i n i ++)

printf ( "%d " , [ ]);

Trang 6

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 bài viết diễn đàn

• Tin nhắn riêng

• Thêm vào Danh bạ

Trang 7

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 , , tmp , swap ;

for( i 0 i n 1 i ++)

{

swap = ; //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

}

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

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w