THUẬT TOÁN QUICKSORT TRONG C++

     

Tìm đọc thuật toán bố trí nhanh Quick sort, ý tưởng, ưu nhược điểm, độ phức hợp của thuật toán. Bí quyết cài để minh họa thuật toán quicksort bằng C/C++. Cùng liên tiếp series các nội dung bài viết về thuật toán của bản thân nhé!


1. Bố trí nhanh – Quick sort là gì?

Thuật toán bố trí nhanh hay còn được gọi là QuickSort Algorithm là một trong những trong 6 thuật toán bố trí thông dụng độc nhất vô nhị của công nghệ máy tính. Thuật toán sử dụng tư tưởng phân chia để trị phải còn được ví là part sort cùng thuộc loại sắp xếp phức tạp. Từ dãy ban đầu, tín đồ ta sẽ phân chia dãy thành nhị phần nhỏ tuổi theo một nguyên tắc xác định, từ đó giúp cải thiện tốc độ của câu hỏi săp xếp.

Bạn đang xem: Thuật toán quicksort trong c++


*
Hình minh họa Quick sort

Thuật toán sắp xếp nhanh được trở nên tân tiến vào năm 1959 vì Tony Hoare lúc ông đang là sv thỉnh giảng tại Đại học tập Tổng vừa lòng Moscow. Lúc đó, Hoare đang tiến hành một dự án về thứ dịch đến Phòng thí nghiệm vật dụng lý Quốc gia. Là 1 phần của quá trình dịch thuật, ông đề nghị sắp xếp các từ của những câu tiếng Nga trước lúc tra cứu chúng trong trường đoản cú điển Nga-Anh sẽ được bố trí theo sản phẩm tự bảng chữ cái và được lưu trữ trong băng từ. Để chấm dứt nhiệm vụ này, ông vẫn phát hiển thị Quick Sort và tiếp đến đã xuất bản mã năm 1961.

Quick Sort là thuật toán đáng được thân thiết và thực sự khôn cùng quan trọng. Hầu hết trong các thư viện của các ngôn ngữ lập trình bây giờ đều bao gồm sẵn thuật toán này. Chúng ta cũng hãy nhằm nó trong thư viện trí não của bản thân nhé!

2. Ý tưởng thuật toán

Quicksort là thuật toán ứng dụng phát minh chia nhỏ tuổi để trị. Đầu tiên nó phân tách mảng nguồn vào thành nhị mảng nhỏ một nửa nhỏ tuổi hơn, một nửa to hơn dựa vào một phần tử trung gian. Sau đó, nó thu xếp đệ quy các mảng bé để giải quyết bài toán.

Mấu chốt của thuật toán ở bài toán chia mảng con hay còn được gọi là thuật toán phân đoạn. Giải pháp giải quyết có thể tóm tắt như sau:

Chọn một trong những phần tử trong mảng làm phần tử trung gian để phân tách đôi mảng hotline là pivot. Thông thường ta thường chọn bộ phận đầu tiên, bộ phận ở thân mảng hoặc bộ phận cuối cùng của mảng để làm pivot.Phân đoạn: di chuyển phần tử có giá chỉ trị bé dại hơn pivot về một bên, toàn bộ các phần tử có giá chỉ trị lớn hơn pivot xếp về một bên (các giá chỉ trị bằng pivot có thể đi theo một trong những hai cách).Sau bước phân đoạn dịch rời pivot về đúng địa điểm giữa của 2 mảng conÁp dụng đệ quy công việc phân đoạn trên đến hai mảng nhỏ để tiến hành sắp xếp

Trường phù hợp dừng của đệ quy là khi những mảng bé có form size bằng 0 hoặc 1, lúc đó nó đang được bố trí theo định nghĩa, do vậy bọn chúng không khi nào cần buộc phải sắp xếp.

Lưu đồ dùng thuật toán sắp xếp nhanh:


*
Lưu thứ thuật toán

3. Cài đặt thuật toán Quick Sort C/C++

Như vẫn nói ở phần trên, việc phân đoạn chính là việc quan trọng đặc biệt nhất. Chúng ta có thể xây dựng thuật toán phân đoạn riêng hoặc hoàn toàn có thể viết chung luôn với quickSort trong cùng một hàm đầy đủ được. Để dễ dàng nắm bắt mình sẽ viết riêng thành nhị hàm riêng biệt.

Có 3 bí quyết chọn pivot (phần tử làm chốt), mục tiêu là để lựa chọn được thành phần có quý giá trung gian để chia làm hai vế mang lại danh sách.

Xem thêm: Hiếp Dâm Nhân Viên Điều Tra 18, Phim Sex Hiep Dam Nhan Vien Dieu Tra

Chọn bộ phận đầu mảngChọn bộ phận ở giữa mảngChọn bộ phận cuối mảng

Bài viết này mình sẽ chọn bộ phận ở cuối làm chốt và setup bằng ngôn từ C/C++

3.1 Thuật toán phân đoạn

Hàm phân đoạn ở phía bên dưới viết với ý tưởng:

Có 3 thông số truyền vào: mảng a, low, high. Low cùng hight lần lượt là chỉ số đầu và chỉ còn số cuốiChia mảng thành 2 phần: mặt trái bé dại hơn pivot, mặt phải to hơn pivotChọn pivot là thành phần cuối cùng: pivot = a; lef chỉ sổ đầu của mảng: left = low;right chỉ số cuối của mảng trừ pivot: right = high – 1;

Thực hiện tại vòng lặp trong những khi left trong những khi left (tìm cho tới vị trị a > pivot)Trong khi right >= left a > pivot: right –;(tìm tới vị tri a)Khi kiếm được vị trí của left, right say mê hợp, có nghĩa là ( a > pivot a swap(a, a);

Cuối cùng là gửi pivot về giữa mảng: swap(a, a);

// Hàm phân đoạnint partition(int a<>, int low, int high)int pivot = a; // chọn pivot là bộ phận cuối cùngint right = high-1, left = low; // lựa chọn left, rightwhile(true) // trong những khi còn đúng (left =left && a>pivot) right--; // tìm right mê say hợpif(left>=right) // left >= right dừngbreak;swap(a, a); // Đổi chỗleft++; // Xét thành phần tiếp theoright--;swap(a, a); // Đổi nơi pivot về thân mảngreturn left; // Trả về địa điểm của pivot // Hàm đổi giá trị hai phần tửvoid swap(int &a, int &b)int temp;temp = a;a = b;b = temp;Hàm quickSort C/C++ full:

// Hàm phân đoạnint partition(int a<>, int low, int high)int pivot = a; // lựa chọn pivot là phần tử cuối cùngint right = high-1, left = low; // chọn left, rightwhile(true) // trong những khi còn đúng (left =left && a>pivot) right--; // kiếm tìm right yêu thích hợpif(left>=right) // left >= right dừngbreak;swap(a, a); // Đổi chỗleft++; // Xét phần tử tiếp theoright--;swap(a, a); // Đổi vị trí pivot về thân mảngreturn left; // Trả về vị trí của pivot // Hàm quick sortvoid quickSort(int a<>, int low, int high){if(low

3.2 Hàm Quick Sort full

Quick sort bao gồm sử dụng giải thuật đệ quy, nếu như bạn không biết đệ quy là gì hoàn toàn có thể tham khảo trên đây.

void quickSort(int a<>, int low, int high){if(low

Code quickSort phối hợp phân đoạn C/C++:(ghép hàm phân đoạn với quicksort vào 1 hàm).

// Low là địa chỉ đầu mảng, high là địa điểm cuối mảngpublic void quickSort(int a<>, int low, int high) if (low >= high) // khi đó mảng gồm 0 phần tử, ngừng return; else int pivot = a; // Chọn bộ phận cuối làm cho chốt int right = high - 1; // bộ phận thứ 2 tự bên buộc phải mảng int left = low; // left là bộ phận đầu tiên của mảng while (true) // trong lúc a bé dại hơn pivot, tăng left while (a pivot, sút right while (a > pivot && right >= left) right--; // Sau 2 vòng lặp white, a > pivot cùng a = right) // trường hợp left vượt quá right, ngừng break; swap(a, a); // Đổi chỗ cho phần tử nhỏ dại hơn về trái, lớn hơn về đề xuất pivot left++; // Xét cho tới left, right tiếp theo sau right--; swap(a, a); // Đổi địa điểm pivot về thân mảng quickSort(a, low, left - 1); // Đệ quy mảng phía bên trái quickSort(a, left + 1, high); // Đệ quy mảng bên đề xuất

4. Đánh giá thuật toán sắp xếp nhanh

Bạn cần chú ý một điều ấy là “sắp xếp nhanh” chỉ là tên của thuật toán, không có nghĩa nó nhanh hơn trọn vẹn so với những thuật toán khác. Tùy theo trường hợp tốc độ thuật toán đã khác nhau. Bạn có thể tìm hiều thêm các thuật toán bố trí khác tại đây

Bảng reviews độ phức tạp của thuật toán:

Trường hợpĐộ phức tạpBộ nhớ sử dụng
Tốt nhấtO (n log n)log n
Trung bìnhO (n log n)log n
Xấu nhấtO(n^2 )log n

Trường phù hợp xấu nhất xảy ra khi những lần phân đoạn, ta chọn phải thành phần lớn độc nhất hoặc nhỏ tuổi nhất làm cho chốt.

Trường hợp cực tốt khi các lần phân đoạn, nhị mảng con gồm độ dài bằng nhau.

Xem thêm: Tivi Led Sharp 32 Inch 2T

Ưu điểm:

Thuật toán có độ phức tạp bé dại hơn các thuật toán sắp xếp đơn giản, vận tốc xử lý kha khá nhanh. Trong một số trường hợp, quicksort là thuật toán gồm tốc độ xuất sắc nhấtThông dụng, được áp dụng nhiều trong lập trình, trong thư viện của các ngôn ngữ xây dựng như C++, Java, C# . . .Có thể áp dụng vào xử lý dữ liệu lớn

Nhược điểm:

Thuật toán không có tính ổn định định, không tồn tại tính mê thích ứng, dễ ảnh hưởng bởi dữ liệu đầu vàoTốn không gian bộ nhớ hơn so với những thuật toán bố trí đơn giảnTư tưởng và lời giải khá phức tạpKhó khăn trong việc lựa chọn bộ phận làm chốt trong phân hoạch. Việc lựa chọn có thể ảnh hưởng rất nhiều đến công suất của thuật toán mặc dù ta không cụ đưa ra lựa chọn về tối ưu nhất.

Lời kết

Cuối cùng, mình giữ hộ lời cảm ơn tới bạn đọc đã đọc tới mẫu này của mình. Chúc các bạn thành công!