Sắp xếp là quá trình bố trí lại các phần tử của 1 tập hợp theo thứ tự nào đó. Mục đích chính của sắp xếp là làm cho thao tác tìm kiếm phần tử trên tập đó được dễ dàng hơn. Ví dụ về tập các đối
tượng được sắp phổ biến trong thực tế là: danh bạ điện thoại được sắp theo tên, các từ trong từ điển
được sắp theo vần, sách trong thư viện được sắp theo mã số, theo tên, .v.v.
Nhìn chung, có rất nhiều thao tác xử lý dữ liệu cần đến việc sắp xếp các phần tử dữ liệu theo trình tự nào đó. Trên thực tế, sắp xếp là một thao tác khá đơn giản. Tuy nhiên, như chúng ta sẽ thấy, có rất nhiều giải thuật sắp xếp khác nhau, từ đơn giản tới phức tạp. Và các kỹ thuật được sử dụng trong các giải thuật sắp xếp này được nghiên cứu và phân tích nhiều hơn là chính bản thân giải thuật sắp xếp. Các kỹ thuật này được coi là cơ sở để xây dựng nhiều giải thuật quan trọng khác. Do đó, các
thuật toán sắp xếp được trình bày và phân tích kỹ trong hầu hết các tài liệu về giải thuật.
Các giải thuật sắp xếp còn là một ví dụ điển hình cho sự đa dạng của thuật toán. Cùng một mục
đích, nhưng có rất nhiều cách thực hiện, mỗi cách tối ưu trên một khía cạnh nào đó, và có một số
cách sắp xếp có nhiều ưu điểm hơn những cách khác. Do đó, sắp xếp cũng được sử dụng như một ví dụ điển hình trong việc phân tích thuật toán.
Thông thường, các giải thuật sắp xếp được chia làm 2 loại. Loại thứ nhất là các giải thuật được
cài đặt đơn giản, nhưng không hiệu quả (phải sử dụng nhiều thao tác). Loại thứ hai là các giải thuật
được cài đặt phức tạp, nhưng hiệu quả hơn về mặt tốc độ (dùng ít thao tác hơn). Đối với các tập dữ
liệu ít phần tử, tốt nhất là nên lựa chọn loại thứ nhất. Đối với tập có nhiều phần tử, loại thứ hai sẽ
91
Các đối tượng dữ liệu cần sắp xếp thường có nhiều thuộc tính, và ta cần chọn một thuộc tính làm khóa để sắp xếp dữ liệu theo khóa này. Ví dụ, đối tượng về người thường có các thuộc tính cơ
bản như họ tên, ngày sinh, giới tính, v.v., tuy nhiên họ tên thường được chọn làm khóa để sắp xếp. Tham số để tính toán hiệu quả của giải thuật thường là thời gian thực hiện. Đối với các phương
pháp sắp xếp đơn giản, thời gian thực hiện (số thao tác thực hiện) tỷ lệ với N2, trong đó N là số phần tử của tập. Các giải thuật sắp xếp phức tạp và tinh xảo hơn có thời gian thực hiện tỷ lệ với NlogN.
Người ta chứng mình được rằng, không có giải thuật nào có thể có thời gian thực hiện nhỏ hơn
NlogN. Ngoài thời gian thực hiện, dung lượng bộ nhớ bị chiếm cũng là một tham số để đánh giá tính
hiệu quả của giải thuật.
Một vấn đề nữa cần phải chú ý khi thực hiện sắp xếp, đó là tính ổn định của giải thuật sắp xếp. Một giải thuật được gọi là ổn định nếu sau khi sắp xếp, nó giữ nguyên vị trí của các phần tử có cùng giá trị khóa. Chẳng hạn, với danh sách theo vần họ tên các sinh viên trong một lớp. Nếu ta tiến hành sắp danh sách này theo điểm, thì các sinh viên có cùng điểm vẫn được sắp theo vần họ tên. Hầu hết các giải thuật sắp xếp đơn giản có tính ổn định, trong khi các giải thuật tinh xảo hơn lại không có tính chất này.
7.2 CÁC GIẢI THUẬT SẮP XẾP ĐƠN GIẢN 7.2.1 Sắp xếp chọn