[Giải thuật] Các thuật toán sắp xếp trong lập trình C - Sắp xếp nổi bọt

Share:

Sắp xếp các nút của một cấu trúc theo thứ tự tăng dần (hay giảm dần) là một công việc được thực hiện thường xuyên. Với một cấu trúc đã được sắp xếp chúng ta rất thuận tiện khi thực hiện các tác vụ trên cấu trúc như tìm kiểm, trích lọc, duyệt cấu trúc ....


Có hai loại giải thuật sắp xếp được dùng phổ biến trong khoa học máy tính là sắp xếp nội (internal sorting) và sắp xếp ngoại (external sorting):
  1. Với loại sắp xếp nội thì toàn bộ dữ liệu cần sắp xếp được đưa vào bộ nhớ trong, do vậy kich thước dữ liệu cần sắp xếp không lớn, tuy nhiên thời gian sắp xếp được thực hiện rất nhanh.
  2. Với loại sắp xếp ngoại thì chỉ một phần nhỏ dữ liệu cần sắp xếp được đưa vào bộ nhớ trong, phần lớn dữ liệu còn lại được lưu ở bộ nhớ ngoài (như đĩa từ băng từ, ...), kích thước dữ liệu cần sắp xếp lúc này rất lớn (phụ thuộc vào kích thước của đĩa từ, băng từ, ...), và thời gian sắp xếp thực hiện rất chậm.
<- -="" ad=""> <- -="" ad="">
Sau đây ta chỉ nguyên cứu về giải thuật sắp xếp nội
Nội dung sẽ trình bầy:

  1. Bubble sort. (Nổi bọt, nổi bong bóng)
  2. Quick sort. (Sắp xếp nhanh)
  3. Simple selection sort. (Sắp xếp chọn)
  4. Heap sort. (Sắp xếp vun đống)
  5. Simple insertion sort.(Sắp xếp chèn)
  6. Shell sort.
  7. Merge sort. (Sắp xếp hòa nhập)
Bubble sort

1. Bài toán
Cho dãy X = {X1, X1, ..., Xn}, hãy sắp xếp dãy theo chiều không giảm.
2. Ý tưởng
- Thao tác cơ bản của thuật toán này là so sánh hai phần từ kề nhau X[i] và X[i-1], nếu chúng đứng chưa đúng thứ tự thì đổi chổ cho nhau. Sau một chu trình so sánh, nếu thực hiện từ phải sang trái phần từ đầu tiên (hoặc cuối cùng nếu theo chiều ngược lại) đứng đúng vị trí, bỏ qua phần từ đó.
- Tiếp tục thực hiện với dãy là những phần tử còn lại.
3. Giải thuật
- Bước 1: i=1
- Bước 2: Lần lượt so sánh và đổi chổ (nếu cần) từ phải sang trái đối với các phần từ từ X[n] đến X[i]
- Bước 3: i=i+1
- Bước 4:
* Nếu i < n, quay lại Bước 2.
* Ngược lại, dừng, dãy đã cho đã sắp xếp đúng vị trí.
 Mô tả phương pháp:
Phương pháp này sẽ duyệt danh sách nhiều lần, trong mỗi lần duyệt sẽ lần lượt so sánh cặp nút thứ i và thứ i+1 và đổi chỗ hai nút này nếu chúng không đúng thứ tự.
Ví dụ cho một dãy số đơn giản và sắp xếp cho nó tăng dần.
25 55 45 90 10
Và đây sẽ minh họa quá trình so sánh và đổi chỗ trong lần duyệt đầu tiên.
So sánh nút thứ i với nút thứ i+1 nếu nút thứ i > nút i+1 thì đổi chỗ 2 nút với nhau. Nếu không tiếp tục so sánh tiếp.
  1. So sánh 25 với 55:kiểm tra 25 < 55 -> Sai không đổi chỗ.
  2. So sánh tiếp 55 với phần tử tiếp theo là 45: 55 > 45 -> Đúng đổi chỗ 45 với 55
  3. So sánh tiếp 55 với 90: 55 < 90 -> sau không đổi chỗ.
  4. So sánh tiếp 90 với 10: 90 > 10 -> đúng đổi chỗ 90 cho 10.

Danh sách sau khi biến đổi lần thứ nhất.
25 45 55 10 90.
Ta nhận thấy phần tử 90 lớn nhất được đưa về cuối danh sách, cứ tuần tự kiểm tra n lần như vậy ta sẽ được một danh sách tăng dần.
Tiếp giờ ta sẽ Mô Tả Giải Thuật Bubble Sort
C++ Code:
  1. Dữ liệu nhập: Danh sách n nút chưa sắp xếp.
  2. Dữ liệu xuất: Danh sách n nút đã sắp xếp.
  3. Biến tạm: doicho
  4. Hành động:
  5. Gán doicho = true;
  6. for(int i = 1;< n && doicho = true;i++)
  7.  {
  8.       Gán doicho = flase;
  9.       for(= 0;< n-1; j++)
  10.           if(nodes[j] > nodes[j+1]))
  11.           {
  12.                 Gán doicho = true;  
  13.                 Đỗi chỗ cho hai nút tại vị trí j và j+1
  14.           }
  15.  }
  16. Kết thúc
Cài đặt giải thuật Bubble sort
C++ Code:
void BubbleSort(int nodes[],int n)  // n la so phan tu trong mang nodes[]
  1. {
  2.    int temp,i,j;
  3.    bool doicho = true;
  4.    for(= 1; i < n && doicho == true; i++)
  5.    {
  6.     doicho = false;
  7.       for(= 0;< n-i; j++)
  8.             if(nodes[j] < nodes[j+1])
  9.         {
  10.             doicho = true;
  11.             temp = nodes[j];
  12.             nodes[j] = nodes[j+1];
  13.             nodes[j+1] = temp;
  14.         }
  15.    }
  16. }
Một cách biểu diễn khác của thuật toán:
- Swap là hàm đổi chỗ hai biến cho nhau, dùng để hoán đổi hai giá trị của hai vị trí trong mảng cần sắp xếp.
- Hàm BubbleSort là hàm nổi bọt, so sánh hai vị trí liên kề nhau, nếu không đúng tính chất (tăng dần, không tăng, giảm dần, không giảm) thì đổi chỗ 


Nhận xét: Giải thuật bubble sort dễ hiểu nhưng không tối ưu vì thời gian thực hiện giải thuật dài.

Download hàm sắp xếp nổi bọt miễn phí