1. Trang chủ
  2. » Thể loại khác

giai thuat sap xep noi bot

6 159 1

Đ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 6
Dung lượng 366,99 KB

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

Nội dung

Giải thuật sắp xếp cố định và sắp xếp so sánh Một giải thuật sắp xếp được gọi là sắp xếp cố định nếu sau khi tiến hành sắp xếp thì vị trí tương đối giữa các phần tử bằng nhau không bị t

Trang 1

Giải thuật sắp xếp trong cấu trúc dữ liệu & giải

thuật Sắp xếp là sắp xếp dữ liệu theo một định dạng cụ thể Trong khoa học máy tính, giải thuật sắp xếp xác định cách để sắp xếp dữ liệu theo một thứ tự nào đó Sắp xếp theo thứ tự ở đây là sắp xếp theo thứ tự dạng số hoặc thứ tự dạng chữ cái như trong từ điển

Tính quan trọng của việc sắp xếp dữ liệu nằm ở chỗ: việc tìm kiếm dữ liệu có thể được tối

ưu nếu dữ liệu được sắp xếp theo một thứ tự nào đó (tăng hoặc giảm) Sắp xếp cũng được

sử dụng để biểu diễn dữ liệu trong một định dạng dễ đọc hơn

Giải thuật sắp xếp In-place và Not-in-place

Các giải thuật sắp xếp có thể cần thêm một số bộ nhớ phụ để so sánh và bộ nhớ tạm để lưu giữ một số phần tử dữ liệu

Những giải thuật mà không yêu cầu thêm bất kỳ bộ nhớ phụ và việc sắp xếp được tiến hành trong chính phần bộ nhớ đã khai báo trước đó (ví dụ trong một mảng chẳng hạn) thì

được gọi là in-place sorting Ví dụ cho loại giải thuật sắp xếp này là giải thuật sắp xếp nổi bọt (bubble sorting)

Nhưng trong một số giải thuật sắp xếp, chương trình cần thêm lượng bộ nhớ mà có thể lớn

hơn hoặc bằng với số phần tử đang được sắp xếp Các giải thuật này được gọi là not-in-place sorting Ví dụ cho loại giải thuật này là sắp xếp trộn (merge sort)

Giải thuật sắp xếp cố định và sắp xếp so sánh

Một giải thuật sắp xếp được gọi là sắp xếp cố định nếu sau khi tiến hành sắp xếp thì vị trí tương đối giữa các phần tử bằng nhau không bị thay đổi

Trang 2

Một giải thuật được gọi là sắp xếp so sánh nếu trong quá trình thực hiện giải thuật chúng ta tiến hành so sánh các khóa và đổi chỗ các phần tử cho nhau Tức là khi đó vị trí tương đối của các phần tử bằng nhau bị thay đổi

Giải thuật sắp xếp Adaptive và Non-Adaptive

Một giải thuật được xem như là adaptive, nếu nó tận dụng các phần tử đã được sắp xếp trong danh sách mà đã được sắp xếp Đó là, trong khi sắp xếp nếu danh sách ban đầu có một số phần tử đã được sắp xếp, thì giải thuật dạng adaptive sẽ ghi nhận các phần tử này

và sẽ cố gắng không thay đổi thứ tự của chúng

Trái ngược với loại giải thuật trên, giải thuật dạng non-adaptive sẽ không ghi nhận các phần tử đã được sắp xếp trước đó Giải thuật loại này sẽ vấn cố gắng sắp xếp lại từng phần tử trong danh sách ban đầu

Trang 3

Các khái niệm quan trọng trong giải thuật sắp xếp

Dưới đây là phần giới thiệu ngắn gọn cho một số khái niệm xuất hiện trong khi thảo luận về các giải thuật sắp xếp:

Thứ tự tăng

Một dãy giá trị được xem như trong thứ tự tăng dần nếu phần tử đứng sau lớn hơn phần tử đứng trước Ví dụ: 1, 3, 5, 6, 9

Thứ tự giảm

Một dãy giá trị được xem như trong thứ tự giảm dần nếu phần tử đứng sau nhỏ hơn phần

tử đứng trước Ví dụ: 9, 6, 5, 3, 1

Thứ tự không tăng

Một dãy giá trị được xem như trong thứ tự không tăng nếu phần tử đứng sau nhỏ hơn hoặc bằng phần tử đứng trước Ví dụ: 9, 6, 5, 5, 1 Loại thứ tự này xuất hiện khi trong một dãy

có chứa các giá trị giống nhau (trong ví dụ là 5)

Thứ tự không giảm

Một dãy giá trị được xem như trong thứ tự không giảm nếu phần tử đứng sau lớn hơn hoặc bằng phần tử đứng trước Ví dụ: 1, 5, 5, 6, 9 Loại thứ tự này xuất hiện khi trong một dãy

có chứa các giá trị giống nhau (trong ví dụ là 5)

ắp xếp nổi bọt (Bubble Sort) là gì ?

Sắp xếp nổi bọt là một giải thuật sắp xếp đơn giản Giải thuật sắp xếp này được tiến hành dựa trên việc so sánh cặp phần tử liền kề nhau và tráo đổi thứ tự nếu chúng không theo thứ tự

Giải thuật này không thích hợp sử dụng với các tập dữ liệu lớn khi mà độ phức tạp trường hợp xấu nhất và trường hợp trung bình là Ο(n2) với n là số phần tử

Giải thuật sắp xếp nổi bọt là giải thuật chậm nhất trong số các giải thuật sắp xếp cơ bản Giải thuật này còn chậm hơn giải thuật đổi chỗ trực tiếp mặc dù số lần so sánh bằng nhau, nhưng do đổi chỗ hai phần tử kề nhau nên số lần đổi chỗ nhiều hơn

Cách giải thuật sắp xếp nổi bọt làm việc?

Giả sử chúng ta có một mảng chưa qua sắp xếp gồm các phần tử như dưới đây Bây giờ chúng ta sử dụng giải thuật sắp xếp nổi bọt để sắp xếp mảng này

Trang 4

Giải thuật sắp xếp nổi bọt bắt đầu với hai phần tử đầu tiên, so sánh chúng để kiểm tra xem phần tử nào lớn hơn

Trong trường hợp này, 33 lớn hơn 14, do đó hai phần tử này đã theo thứ tự Tiếp đó chúng

ta so sánh 33 và 27

Chúng ta thấy rằng 33 lớn hơn 27, do đó hai giá trị này cần được tráo đổi thứ tự

Mảng mới thu được sẽ như sau:

Tiếp đó chúng ta so sánh 33 và 35 Hai giá trị này đã theo thứ tự

Sau đó chúng ta so sánh hai giá trị kế tiếp là 35 và 10

Vì 10 nhỏ hơn 35 nên hai giá trị này chưa theo thứ tự

Trang 5

Tráo đổi thứ tự hai giá trị Chúng ta đã tiến tới cuối mảng Vậy là sau một vòng lặp, mảng

sẽ trông như sau:

Để đơn giản, tiếp theo mình sẽ hiển thị hình ảnh của mảng sau từng vòng lặp Sau lần lặp thứ hai, mảng sẽ trông giống như:

Sau mỗi vòng lặp, ít nhất một giá trị sẽ di chuyển tới vị trí cuối Sau vòng lặp thứ 3, mảng

sẽ trông giống như:

Và khi không cần tráo đổi thứ tự phần tử nào nữa, giải thuật sắp xếp nổi bọt thấy rằng mảng đã được sắp xếp xong

Tiếp theo, chúng ta tìm hiểu thêm một số khía cạnh thực tế của giải thuật sắp xếp

Giải thuật cho sắp xếp nổi bọt (Bubble Sort)

Giả sử list là một mảng có n phần tử Tiếp đó giả sử hàm swap để tráo đổi giá trị của các

phần tử trong mảng (đây là giả sử, tất nhiên là bạn có thể viết code riêng cho hàm swap này)

B t đầ u gi ả i thu ậ t BubbleSort ( list ) for t ấ t c ả ph ầ n t ử trong list if list [ ] > list [ + ] swap ( list [ ], list [ + ]) k ế t th ú c if k ế t

th ú c for return list K ế t th ú c BubbleSort

Trang 6

Giải thuật mẫu cho sắp xếp nổi bọt (Bubble Sort)

Chúng ta thấy rằng giải thuật sắp xếp nổi bọt so sánh mỗi cặp phần tử trong mảng trừ khi

cả toàn bộ mảng đó đã hoàn toàn được sắp xếp theo thứ tự tăng dần Điều này có thể làm

tăng độ phức tạp, tức là tăng các thao tác so sánh và tráo đổi không cần thiết nếu như

mảng này không cần sự tráo đổi nào nữa khi tất cả các phần tử đã được sắp xếp theo thứ

tự tăng dần rồi

Để tránh việc này xảy ra, chúng ta có thể sử dụng một biến swapped chẳng hạn để giúp

chúng ta biết có cần thực hiện thao tác tráo đổi thứ tự hay không Nếu không cần thiết thì

thoát khỏi vòng lặp

Bạn theo dõi phần giải thuật mẫu minh họa sau:

B t đầ u h à m bubbleSort ( list : m ả ng c á c ph ầ n t ử ) loop = list count ;

for i = 0 t ớ i loop - th ự c hi ệ : swapped = false for j

= 0 t ớ i loop - th ự c hi ệ : /* so sánh các phần tử cạnh nhau */

if list [ ] > list [ + ] then /* tráo đổi chúng */ swap (

list [ ], list [ + ] ) swapped = true k ế t th ú c

if k ế t th ú c for /*Nếu không cần tráo đổi phần tử

if(not swapped ) then break k ế t th ú c if k ế t th ú c for

K t th ú c h à m return list

Triển khai giải thuật sắp xếp nổi bọt trong C

Một điều nữa mà chúng ta chưa nói tới trong 2 phần thiết kế giải thuật đó là cứ sau mỗi

vòng lặp thì các giá trị lớn nhất sẽ xuất hiện ở vị trí cuối mảng (như trong hình minh họa:

sau vòng lặp 1 là 35; sau vòng lặp 2 là 33 và 35; …) Do đó, vòng lặp tiếp theo sẽ không

cần bao gồm cả các phần tử đã được sắp xếp này Để thực hiện điều này, trong phần code

chúng ta giới hạn vòng lặp lặp bên để tránh phải lặp lại các giá trị đã qua sắp xếp này

Để theo dõi code đầy đủ của giải thuật sắp xếp nổi bọt trong ngôn ngữ C, mời bạn click

chuột vào chương: Sắp xếp nổi bọt (Bubble Sort) trong C

Ngày đăng: 02/12/2017, 13:35

TỪ KHÓA LIÊN QUAN

w