- vừa được xem lúc

Interchange Sort - ĐPT O(n^2)

0 0 12

Người đăng: hanh le

Theo Viblo Asia

Đây là bài viết đầu tiên trong series về các thuật toán sắp xếp và tìm kiếm căn bản.
Mình xin giới thiệu các bạn thuật toán sắp xếp Interchange Sort - ĐPT O(n^2).
Mình sẽ cố trình bày mọi thứ theo cách dễ hiểu nhất nhé.
Có một câu nói của Einstein dưới đây, làm mình thực sự tâm đắc:

"Nếu bạn không giúp được một đứa trẻ 6 tuổi hiểu ra vấn đề, thị thật ra... bạn chẳng hiểu gì cả!" - Einstein

Nên nếu bạn không hiểu, thì đó là lỗi của mình nhé. Mình khuyến khích các bạn hỏi tất cả mọi thứ mà bản thân thắc mắc luôn ha.


Ok, bắt đầu nè...
Nếu ai đó cho bạn một dãy số gồm N phần tử lộn xộn, thì bạn sẽ làm như thế nào để sắp xếp nó nhỉ?
Một ý tưởng đơn giản nhất có thể nghĩ ra là:

  • Bước 1. Đầu tiên, mình sẽ tìm ra giá trị nhỏ nhất của dãy số từ vị trí 1..N.
  • Bước 2. Sau đó, đổi chỗ giá trị nhỏ nhất đó cho vị trí đầu tiên.
  • Bước 3. Lặp lại bước 1 và bước 2, nhưng giờ đây là từ vị trí số 2 (vì giờ đây ta đã có giá trị đầu tiên là giá trị nhỏ nhất rồi, nên có thể bỏ qua nó).

Mình để ý rằng, khi đến bước 3, thực sự ta đã thu hẹp được bài toán. Từ dãy số 1..N, giờ đây còn 2..N. Và cứ như thế thì ta cứ thu hẹp dần cho đến N..N thì coi như xong.
Và đây chính là thuật toán interchange sort.

Dưới đây là code mẫu mình đã chuẩn bị:

#include <cstdlib>
#include <iostream> using namespace std; const int sz = 10;
int arr[sz]; void printArray() { for (int i=0; i<sz; i++) { cout<<arr[i]<<" "; } cout<<endl;
} void printArray(int pos) { cout<<"Array after "<<pos<<"-th min position changed: \n"; for (int j=0; j<=pos; j++) { cout<<arr[j]<<" "; } cout<<"|"; for (int j=pos+1; j<sz; j++) { cout<<" "<<arr[j]; } cout<<endl;
} int main(){ for (int i=0; i<sz; i++) { arr[i] = rand() % 100; } cout<<"Original array: \n"; printArray(); for (int i=0; i<sz-1; i++) { int minPosition = i; for (int j=i+1; j<sz; j++) { if (arr[minPosition] > arr[j]) { minPosition = j; } } swap(arr[i], arr[minPosition]); printArray(i); } return 0;
}

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học lập trình game cần những gì?

Lập trình game là làm gì. Các ngôn ngữ các bạn có thể sử dụng để lập trình game : C, C++, C#, Java, Python,... Các bước cơ bản để lập trình game. . Hiển thị: Đã là game thì hiển thị không thể thiếu, lúc đầu các bạn chỉ làm cho phần hiển thị thật đơn giản, các bạn đừng quá chú tâm vào việc làm sao ch

0 0 32

- vừa được xem lúc

[MFC] Http request with winsock2.h

Giới thiệu. Xin chào, trong bài này mình sẽ giới thiệu 1 số lưu ý khi sử dụng thư viện winsock2.h (thư viện window socket) sử dụng trong window app. Đầu tiên, bạn sẽ dễ dàng search được 1 ví dụ cụ thể trên document của winsock2.

0 0 22

- vừa được xem lúc

Design parttern

Builder. 1. Ý tưởng. Builder là một mẫu thiết kế sáng tạo cho phép bạn xây dựng các đối tượng phức tạp theo từng bước.

0 0 22

- vừa được xem lúc

Kỹ thuật viết mã nguồn hiệu quả

Kỹ thuật viết mã nguồn hiệu quả? Hôm nay bài viết này mình không đề cập tới thuật toán, hãy coi như rằng chúng ta đã có thuật toán tốt nhất có thể và bây giờ chúng ta phải làm gì để có thể tăng tính hiệu quả của code. Bài viết này mình sẽ lấy ngôn ngữ lập trình C/C++ để minh họa về các hàm, các thao

0 0 23

- vừa được xem lúc

Singleton Design pattern

Singleton Design pattern. 1. Vấn đề. - Ý tưởng:.

0 0 21

- vừa được xem lúc

So sánh Python và C++

Cuộc tranh luận giữa Python và C ++ là một chủ đề hấp dẫn vì cả hai ngôn ngữ lập trình đều rất khác nhau về cú pháp, tính đơn giản, cách sử dụng và cách tiếp cận tổng thể để lập trình. Vì vậy, mọi người cảm thấy khó khăn khi lựa chọn ngôn ngữ lập trình nào để học.

0 0 26