Các bài tập về thuật toán sắp xếp năm 2024
Sắp xếp dữ liệu là một phần không thể thiếu khi bạn học và làm việc về lập trình. Phần này mình sẽ liệt kê 6 giải thuật sắp xếp thông dụng. Show Các giải thuật sắp xếp trong PHPDưới đây là danh sách các giải thuật sắp xếp trong PHP. Bạn click chuột vào đường link để theo dõi lời giải minh họa cũng như kết quả của bài tập PHP tương ứng.
Quảng cáo Các bài tập PHP có giải khác có trên VietJack:
Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS. Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube: Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Ngữ pháp tiếng Anh, luyện thi TOEIC, PHP, Java, C, C++, Javascript, HTML, Python, Database, Mobile ... mới nhất của chúng tôi. Sắp xếp là một trong những thao tác cơ bản mà chúng ta thực hiện trên các đối tượng. Ngay cả khi còn nhỏ, trẻ em được dạy sắp xếp khi chúng phát triển kỹ năng tư duy. Máy tính và phần mềm cũng không ngoại lệ. Có rất nhiều thuật toán sắp xếp trong Java . Tôi khuyên bạn nên kiểm tra chúng là gì và chúng hoạt động như thế nào. Điều gì sẽ xảy ra nếu bạn được hỏi về một trong số họ tại một cuộc phỏng vấn vào một ngày nào đó? Giới thiệuSắp xếp các phần tử là một trong những loại thuật toán mà nhà phát triển phải biết. Nếu khoa học máy tính đã từng không được coi trọng khi tôi còn đi học, thì học sinh ngày nay phải có khả năng thực hiện và hiểu các thuật toán sắp xếp. Các thuật toán cơ bản, đơn giản nhất, được thực hiện bằng vòng lặp for . Đương nhiên, để sắp xếp một tập hợp các phần tử, chẳng hạn như một mảng, bằng cách nào đó bạn cần duyệt qua tập hợp đó. Ví dụ:
Có thể nói gì về đoạn mã này? Chúng ta có một vòng lặp trong đó chúng ta thay đổi chỉ số (
3là số lượng phần tử, khi đó
4chương trình sẽ mất gấp đôi thời gian để chạy so với khi
5. Nếu chương trình của chúng ta có một vòng lặp duy nhất, thời gian thực hiện sẽ tăng theo tuyến tính: càng có nhiều phần tử thì thời gian thực hiện càng dài. Hóa ra thuật toán trên hoạt động trong thời gian tuyến tính (một hàm tuyến tính của n). Trong những trường hợp như vậy, chúng ta nói rằng độ phức tạp của thuật toán là "O(n)". Ký hiệu này còn được gọi là "big O" hoặc "hành vi tiệm cận". Nhưng bạn chỉ có thể nhớ " Thuật toán sắp xếp đơn giản nhất (sắp xếp bong bóng)Giả sử chúng ta có một mảng và chúng ta có thể lặp qua nó. Tuyệt vời. Bây giờ hãy thử sắp xếp nó theo thứ tự tăng dần. Điều đó có nghĩa là gì? Có nghĩa là đã cho 2 phần tử (ví dụ ,
7, chúng ta phải sắp xếp lại
8và
9if
8lớn hơn
9(if
2). Điều này có nghĩa là gì khi chúng ta đang sử dụng một chỉ mục để làm việc với một bộ sưu tập (như trường hợp của một mảng)? Nghĩa là nếu phần tử có chỉ số a lớn hơn phần tử có chỉ số
9(
Bây giờ chúng ta có thể viết như sau:
Như bạn có thể thấy, các yếu tố thực sự đã được hoán đổi. Chúng tôi đã bắt đầu với chỉ mục 1, bởi vì nếu mảng chỉ có một phần tử, thì biểu thức
5không hợp lệ cho chỉ mục
6. Làm điều này cũng bảo vệ chúng ta khỏi các trường hợp mảng không có phần tử hoặc chỉ có một phần tử và nó làm cho mã trông đẹp hơn. Nhưng mảng kết quả vẫn chưa được sắp xếp, vì một lượt không đủ để thực hiện việc sắp xếp. Chúng ta sẽ phải thêm một vòng lặp khác trong đó chúng ta sẽ thực hiện lặp đi lặp lại cho đến khi nhận được một mảng đã sắp xếp:
Vì vậy, chúng tôi đã hoàn thành thuật toán sắp xếp đầu tiên của mình. Chúng tôi lặp lại vòng lặp bên ngoài (
8.
9còn hơn cả
0— tất cả đều tốt. Nhưng
1ít hơn
9. Tuy nhiên,
3yêu cầu một lần vượt qua khác, vì
4và chúng cần được hoán đổi. Bởi vì chúng tôi đang sử dụng một vòng lặp trong một vòng lặp, độ phức tạp của thuật toán của chúng tôi tăng lên. Các phần tử đã cho
3, nó trở thành
6, nghĩa là,
7. Đây được gọi là độ phức tạp bậc hai. Nói chung, chúng ta không thể biết chính xác sẽ cần bao nhiêu lần lặp. Biểu thức độ phức tạp của một thuật toán cho thấy độ phức tạp tăng lên như thế nào trong trường hợp xấu nhất. Nghĩa là, nó cho biết thời gian thực hiện sẽ tăng lên bao nhiêu khi số phần tử
3thay đổi. Sắp xếp bong bóng là một trong những thuật toán sắp xếp đơn giản và kém hiệu quả nhất. Đôi khi nó còn được gọi là "stupid sort". Tài liệu về chủ đề này:
sắp xếp lựa chọnMột thuật toán sắp xếp khác là sắp xếp lựa chọn. Nó cũng có độ phức tạp bậc hai, nhưng nhiều hơn về điều đó sau. Vì vậy, ý tưởng là đơn giản. Trên mỗi lần vượt qua, chúng tôi chọn phần tử nhỏ nhất và chuyển nó về đầu. Ngoài ra, mỗi lần vượt qua bắt đầu một bước bên phải. Nói cách khác, lượt đầu tiên bắt đầu từ phần tử thứ 0, lượt thứ hai bắt đầu từ phần tử đầu tiên, v.v. Nó sẽ trông như thế này:
Cách sắp xếp này không ổn định, vì các phần tử giống hệt nhau (về bất kỳ đặc điểm nào mà chúng ta đang sử dụng để sắp xếp các phần tử) có thể thay đổi vị trí tương đối của chúng. Có một ví dụ điển hình là trong bài viết trên Wikipedia về sắp xếp lựa chọn . Tài liệu về chủ đề này:
Sắp xếp chènSắp xếp chèn cũng có độ phức tạp bậc hai, vì chúng ta lại có một vòng lặp bên trong một vòng lặp. Điều gì làm cho sắp xếp chèn khác nhau? Thuật toán sắp xếp này là "ổn định." Điều này có nghĩa là các phần tử giống hệt nhau sẽ không thay đổi thứ tự tương đối của chúng. Một lần nữa, chúng tôi có nghĩa là giống hệt nhau về các đặc điểm mà chúng tôi sắp xếp theo.
loại xe đưa đónCó một thuật toán sắp xếp đơn giản khác: sắp xếp con thoi. Điều này còn được gọi là sắp xếp bong bóng hai chiều hoặc sắp xếp bình lắc cocktail. Những tên thay thế này cho chúng ta biết rằng loại tàu con thoi không phải là về tàu con thoi. Đó là về một cái gì đó di chuyển qua lại. Bây giờ bạn có thể nghĩ về điều đó khi nghĩ về thuật toán này. Bản chất của thuật toán là gì? Bản chất của thuật toán là chúng ta lặp từ trái sang phải, hoán đổi các phần tử và kiểm tra xem có phần tử nào còn lại theo hướng khác cần hoán đổi hay không.
Tài liệu về chủ đề này:
phân loại vỏMột thuật toán sắp xếp đơn giản khác là sắp xếp vỏ. Ý chính của nó tương tự như sắp xếp bong bóng, nhưng trong mỗi lần lặp lại, chúng ta có một khoảng cách khác nhau giữa các phần tử được so sánh. Nó được cắt làm đôi với mỗi lần lặp lại. Đây là một triển khai:
Tài liệu về chủ đề này:
Hợp nhất sắp xếpNgoài các thuật toán sắp xếp đơn giản này, còn có các thuật toán sắp xếp phức tạp hơn. Ví dụ: sắp xếp hợp nhất. Có hai điều cần lưu ý. Đầu tiên, đệ quy đến để giải cứu chúng tôi ở đây. Thứ hai, độ phức tạp của thuật toán không còn là bậc hai như chúng ta đã quen. Độ phức tạp của thuật toán này là logarit. Điều này được viết là
9. Vì vậy, hãy thực hiện nó. Đầu tiên, chúng ta sẽ viết một lời gọi đệ quy tới phương thức sắp xếp:
Bây giờ, hãy thêm hành động chính vào phần triển khai của chúng ta. Đây là siêu phương pháp của chúng tôi:
Chúng ta có thể chạy ví dụ của mình bằng cách gọi
0. Như bạn có thể thấy, quy trình rút gọn lại để chấp nhận một mảng đầu vào cùng với các chỉ dẫn về phần đầu và phần cuối của phần cần được sắp xếp. Khi sắp xếp bắt đầu, đây là phần đầu và phần cuối của mảng. Sau đó, chúng tôi tính toán dấu phân cách, là chỉ mục mà chúng tôi sẽ phân chia mảng. Nếu mảng có thể được chia thành 2 phần, thì chúng ta gọi phương thức sắp xếp theo cách đệ quy cho hai nửa của mảng. Chúng tôi chuẩn bị một bộ đệm phụ, nơi chúng tôi sẽ chèn phần đã sắp xếp. Tiếp theo, đặt chỉ mục ở đầu phần sẽ được sắp xếp và bắt đầu đi qua từng phần tử của bộ đệm trống, lấp đầy nó bằng các phần tử nhỏ nhất. Nếu phần tử được trỏ đến bởi chỉ mục nhỏ hơn phần tử được trỏ đến bởi dấu phân cách, chúng ta đặt phần tử vào bộ đệm và dịch chuyển chỉ mục. Nếu không thì, chúng tôi đặt phần tử được trỏ bởi dấu phân cách vào bộ đệm và dịch chuyển dấu phân cách. Ngay khi dấu phân cách vượt ra ngoài ranh giới của phần được sắp xếp hoặc chúng tôi điền vào toàn bộ mảng, phạm vi đã chỉ định được coi là đã sắp xếp.Tài liệu về chủ đề này:
Đếm sắp xếp và sắp xếp cơ sốMột thuật toán sắp xếp thú vị khác là sắp xếp đếm. Độ phức tạp của thuật toán ở đây là
1, ở đâu
3là số phần tử và
3là giá trị lớn nhất của một phần tử. Thuật toán này có một thiếu sót: chúng ta cần biết các giá trị tối thiểu và tối đa trong mảng. Dưới đây là một ví dụ về sắp xếp đếm:
0 Bạn có thể hiểu rằng rất bất tiện khi chúng ta cần biết trước giá trị nhỏ nhất và giá trị lớn nhất. Và chúng ta có một thuật toán khác ở đây: sắp xếp cơ số. Tôi sẽ chỉ trình bày thuật toán ở đây một cách trực quan. Xem các tài liệu bổ sung để thực hiện: Tài liệu:
Sắp xếp nhanh chóngChà, đã đến lúc ăn tráng miệng — sắp xếp nhanh, một trong những thuật toán sắp xếp nổi tiếng nhất. Nó có độ phức tạp logarit:
9. Thuật toán sắp xếp này được phát triển bởi Tony Hoare. Thật thú vị, anh ấy đã phát minh ra nó khi sống ở Liên Xô, nơi anh ấy học dịch máy tại Đại học Moscow và phát triển một cuốn sách cụm từ tiếng Nga-Anh. Hơn nữa, Java sử dụng phiên bản phức tạp hơn của thuật toán này trong
5. Thế còn
6? Tại sao không xem xét cách mọi thứ được sắp xếp "dưới mui xe"? Đây là mã:
1 Đây là tất cả những thứ rất đáng sợ, vì vậy hãy tìm hiểu sâu về nó. Đối với mảng đầu vào (
7nguồn ), chúng ta tạo hai điểm đánh dấu: trái (
9). Trong lần gọi phương thức đầu tiên, chúng tương ứng với phần đầu và phần cuối của mảng. Sau đó, chúng tôi xác định phần tử trục, được đặt tên một cách thích hợp
0. Sau đó, nhiệm vụ của chúng ta là di chuyển các giá trị nhỏ hơn
0sang trái của
0, và các giá trị lớn hơn — sang phải. Để làm điều này, trước tiên chúng tôi di chuyển
8điểm đánh dấu cho đến khi chúng tôi tìm thấy giá trị lớn hơn
0. Nếu không tìm được giá trị nào nhỏ hơn thì |