Recent Posts

Code C/C++: Thuật toán sắp xếp vun đống (Heap Sort)

-
Ý tưởng thuật toán:
Ta xem danh sách n phần tử a0, a1, …,an-1  là cây nhị phân
Cây nhị phân này được xác định như sau: tại nút thứ i tương ứng với chỉ số thứ i của mảng có con trái là nút 2*(i+1)-1 và con phải 2*(i+1) nếu 2*(i+1)-1 và 2*(i+1) nhỏ hơn n.


Thuật toán được mô tả như sau:
- Xây dựng Heap sao cho với mọi nút cha đều có giá trị lớn hơn nút con. Khi đó nút gốc là nút có giá trị lớn nhất.
- Hoán vị nút gốc với nút thứ n  –1 và xây dựng lại Heap mới với n –2 nút và tiếp tục hoán vị nút gốc với nút lá cuối của cây mới sau n –2 bước ta sẽ thu được danh sách được sắp xếp theo thứ tự.
Ví dụ: xét danh sách trước khi sắp xếp

Cài đặt thuật toán:

#include<math.h>
#include<iostream>
#include<conio.h>
#define max 100
using namespace std;
//Nhập mảng
void NhapMang(int A[],int n){
for(int i=0; i<n;  i++) {
cout<<"nhap Phan tu thu A["<<i<<"] =";
cin>>A[i];
}
}
//Xuất mảng
void XuatMang(int A[],int n){
cout<<endl;
for(int i=0; i<n;  i++)
cout<<A[i]<<"\t";
//Hoán vị 2 phần tử
void Swap(int &a,int &b){
int temp = a;
a = b;
b =  temp;
}
//Hoán vị nút cha thứ i phải lớn hơn nút con
void Heapify(int A[],int n, int i) {
int Left =  2*(i+1)-1;
int Right = 2*(i+1);
int Largest;
if(Left<n && A[Left]>A[i])
Largest = Left;
else
Largest = i;
if(Right<n && A[Right]>A[Largest]) 
Largest = Right;
if(i!=Largest) {
Swap(A[i],A[Largest]);
Heapify(A,n,Largest);
}
}
//Xây dựng Heap sao cho mọi nút cha luôn lớn hơn nút con trên cây
void BuildHeap(int A[], int n) {
for(int i = n/2-1; i>=0; i--)
Heapify(A,n,i);
}
void HeapSort(int A[], int n) {
BuildHeap(A,n);
for(int i = n-1; i>0; i--){
Swap(A[0],A[i]);
Heapify(A,i,0);
}
}
//Chương trình chính
int main(){
int A[max], n;
cout<<"Nhap so phan tu:"; cin>>n;
NhapMang(A,n);
cout<<"\nMang vua nhap la:";
XuatMang(A,n);
cout<<"\nSap xep theo Heap Sort:";
HeapSort(A,n);
XuatMang(A,n);
getch();
return 0;
}
Kết quả chạy chương trình:
Từ khóa: Sắp xếp, thuật toán, chèn, insert, insertion sort, sắp xếp chèn, giải thuật, cấu trúc dữ liệu và giải thuật, sắp xếp nhanh, quick sort, sắp xếp vun đống, heap sort

Related Post:

  • Cấu trúc một ứng dụng Android gồm có những gìCấu trúc một ứng dụng Android gồm có:Thư mục SRCThư mục genThư mục assetsThư  mục libsThư mục resFile AndroidManifest.xmlMội số khái niệm quan trọngActivity, ViewIntent drawablevaluesFile cấu hình các thông số AndroidManifest… Read More
  • Bài 3 - Lập trình hướng đối tượng với JavaĐể lập trình với JAVA thì chúng ta phải nắm chắc 4 kỹ thuật sau:Download source code (Chú ý sau khi click download nhìn lên góc trên cùng bên phải chọn skip add - Bỏ quảng cáo).1. Encapsulation (Đóng gói) Mục đích: Viết code theo kỹ thuật này dễ bảo trì, chỉ cho phép class ngoài truy xuất tới một số phương thức cho phép, tính mở rộng cao.2. Inheritance (Kế t… Read More
  • Cài đặt và tạo một ứng dụng Android đầu tiênĐể bắt đầu làm việc với Android thì chúng ta phải cài đặt những công cụ sau:1. JDK (Java Development Kit) - Bộ công cụ phát triển JavaLink Download 2. ADT (Android Developer Tools)Gói ADT mà Android cung cấp đầy đủ các công cụ sau:Eclipse + ADT pluginAndroid SDK ToolsAndroid Platform-toolsThe latest Android platformThe latest Android system image for the emulator… Read More
  • Bài 4 - Multithreading trong Java Trong Java chúng ta có thể tạo ra nhiều Thread để chạy ở các luồng khác nhau vì vậy gọi là Multi threading và tại một thời điểm có thể có nhiều Thread chạy đồng thời.Để định nghĩa một thread trong Java ta có thể sử dụng cách sau:public class Main { public static void main(String[] args) { //Tạo một thread Thread th = new Thread(childThread); //Run thread đồng… Read More
  • Bài 2 - Bắt đầu với Java1. Data type (Các kiễu dữ liệu):Có 2 loại:+ Primitive Data Types (Dữ liệu nguyên thuỷ):+ Oject Data Types (Dữ liệu kiểu object)     String, Double, Integer, Float...2. Operations (Các toán tử): (Tập chung vào 2 loại sau)+ Các toán tử về số học:phép cộng (+), phép trừ (-), phép nhân (*), phép chia (/), phép chia lấy dư (%), phép tăng lên 1 (++), Phép giả… Read More
  • Giới thiệt một số công cụ trong Android1. SDK - Software development toolkit cung cấp:API librariesbuild TestDebugAndroid Platform-tools 2. Android Emulator - Thiết bị giả lập Tạo máy ảo thế nàoChạy ứng dụng với một máy ảo bất kỳ3. ADT - Android Developer Tools Eclipse + ADT pluginAndroid SDK ToolsAndroid Platform-tools… Read More




Klik untuk melihat kode: :) =( :s :D :-D ^:D ^o^ 7:( :Q :p T_T @@, :-a :W *fck* x@