Showing posts with label Thuật toán Sắp Xếp -Sort. Show all posts
Showing posts with label Thuật toán Sắp Xếp -Sort. Show all posts

[ Sort ] Thuật toán Insert-Sort [Code C++]

 Thuật toán Insert-Sort


Ý tưởng thuật toán: xét dãy n phần tử a[0], a[1], a[2] ,..., a[n-1].
- Xem dãy gồm 1 phần tử a[0] là dãy có thứ tự.
- Thêm a[1] vào dãy có thứ tự a[0] sao cho dãy mới a[0], a[1] là dãy có thứ tự. Nếu a[1] < a[0] ta đổi chỗ a[1] với a[0].
- Thêm a[2] vào dãy có thứ tự a[0], a[1] sao cho dãy mới a[0], a[1], a[2] là dãy có thứ tự.
- Tương tự, tiếp tục như thế đến n – 1 bước ta sẽ có dãy có thứ tự.

Ví dụ: sử dụng thuật toán Insertion Sort sắp xếp dãy {3,7,22,3,1,5,8,4,3,9} theo thứ tự tăng dần.

Thuật toán Insert-Sort

Kết quả sau khi đã thực hiện thuật toán: {1,3,3,3,4,5,7,9,22}

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

[Code Turbo C++]

#include <iostream.h>
#include <conio.h>
#define max 100
//nhap day
void NhapDay(int a[],int n) {
   for(int i=0; i<n; i++) {
    cout<<"\n a["<<i<<"] =";
    cin>>a[i];
   }
}
//xuat day
void XuatDay(int a[],int n) {
   cout<<"\n IN DAY: ";
   for(int i=0; i<n; i++)
     cout<<a[i]<<"\t";
}
//hoan vi 2 phan tu
void Swap(int &a,int &b) {
   int t = a;
   a = b;
   b = t;
}
//thu tuc Insertion Sort
void InsertionSort(int a[],int n) {
   for(int i=1; i<n; i++)
     for(int j=i; j>0; j--)
       if(a[j]<a[j-1])
        Swap(a[j],a[j-1]);
}
//chuong trinh chinh
void main() {
  int a[max],n;
  clrscr();
  cout<<"Nhap so phan tu:";
  cin>>n;
  NhapDay(a,n);
  cout<<"\n Day vua nhap la:";
  XuatDay(a,n);
  cout<<endl;
  InsertionSort (a,n);
  cout<<"\n Day vua sap xep la:";
  XuatDay(a,n);
  getch();
}

// Đề nghị độc giả chuyển code trên sang các ngôn ngữ lập trình khác

[ Sort ] Thuật toán Selection-Sort [Code C++]

 Thuật toán Selection-Sort


Ý tưởng thuật toán: xét dãy n phần tử a[0], a[1], a[2] ,..., a[n-1].
 - Chọn trong dãy a[0], a[1], a[2] ,..., a[n-1] ra phần tử có khỏa nhỏ nhất và đổi chỗ nó với a[0].
 - Chọn trong dãy a[1], a[1], a[2] ,..., a[n-1] ra phần tử có khỏa nhỏ nhất và đổi chỗ nó với a[1].
 - Tương tự, tiếp tục như thế sau n – 1 bước ta thu được danh sách có thứ tự.

Ví dụ: Sau 9 bước lặp ta thu được dãy đã được sắp xếp: {2, 3, 4, 5, 6, 6, 7, 7, 8, 9}.
[Mô phỏng]

Kết quả sau 9 bước lặp ta thu được dãy đã được sắp xếp: {2, 3, 4, 5, 6, 6, 7, 7, 8, 9}.

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

[Code Turbo C++]

#include <iostream.h>
#include <conio.h>
#define max 100
//nhap day
void NhapDay(int a[],int n) {
  for(int i=0; i<n; i++) {
    cout<<"\n a["<<i<<"] =";
    cin>>a[i];
  }
}
//xuat day
void XuatDay(int a[],int n) {
  cout<<"\n IN DAY: ";
  for(int i=0; i<n; i++)
    cout<<a[i]<<"\t";
}
//hoan vi 2 phan tu
void Swap(int &a,int &b) {
   int t = a;
   a = b;
   b = t;
}
//thuat toan Selection Sort
void SelectionSort(int a[],int n) {
   int min; // chi so phan tu nho nhat trong day hien hanh
   for(int i=0; i<n-1; i++) {
      min = i;
      for(int j=i+1; j<n; j++)
         if(a[min]>a[j])
            min = j; //ghi nhan vi tri phan tu nho nhat
      if(min!= i)
           Swap(a[i],a[min]); // doi chu 2 phan tu
   }
}
//chuong trinh chinh
void main() {
  int a[max],n;
  clrscr();
  cout<<"Nhap so phan tu:";
  cin>>n;
  NhapDay(a,n);
  cout<<"\n Day vua nhap la:";
  XuatDay(a,n);
  cout<<endl;

  SelectionSort (a,n);
  cout<<"\n Day vua sap xep la:";
  XuatDay(a,n);

  getch();
}
// Đề nghị độc giả chuyển code trên sang các ngôn ngữ lập trình khác



--------------------------------------------
Xem thêm các thuật toán khác: 


[ Sort ] Thuật toán Bubble-Sort [Code C++]

Thuật toán Bubble-Sort


Ý tưởng thuật toán: 
 - Xuất phát từ phần tử cuối danh sách ta tiến hành so sánh với phần tử bên trái của nó.
 - Nếu phần tử đang xét có khóa nhỏ hơn phần tử bên trái của nó ta tiến đưa nó về bên trái của dãy bằng cách hoán vị với phần tử bên trái của nó.
 - Tiếp tục thực hiện như thế đối với bài toán có n phần tử thì sau n – 1 bước ta thu được danh
sách tăng dần.

Ví dụ: sử dụng thuật toán Bubble Sort sắp xếp dãy số {3, 10, 4, 6, 2, 6, 15, 3, 9,7} theo thứ tự tăng dần.

Thuật toán Bubble-Sort


Sau 9 bước lặp ta thu được dãy đã được sắp xếp: {2, 3, 3, 4, 6, 6, 7, 9, 10, 15}.

Cài đặt thuật toán:
[ Code Turbo C++]

#include <iostream.h>
#include <conio.h>
#define max 100
//nhap day
void NhapDay(int a[],int n) {
  for(int i=0; i<n; i++) {
   cout<<"\n a["<<i<<"] =";
   cin>>a[i];
  }
}
//xuat day
void XuatDay(int a[],int n) {
  cout<<"\n IN DAY: ";
  for(int i=0; i<n; i++)
cout<<a[i]<<"\t";
}
//hoan vi 2 phan tu
void Swap(int &a,int &b) {
  int t = a;
  a = b;
  b = t;
}
//sap xep cac phan tu
void BubbleSort(int a[],int n) {
  for(int i = 0; i < n-1; i++)
    for(int j = n-1; j > i; j--)
      if(a[j]<a[j-1])
        Swap(a[j-1],a[j]);
}
//chuong trinh chinh
void main() {
 int a[max],n;
 clrscr();
 cout<<"\n Nhap so phan tu:";
 cin>>n;
 NhapDay(a,n);

  XuatDay(a,n);
  cout<<"\n Sap xep Bubble-Sort: \n";
  BubbleSort(a,n);
  cout<<"\n Day vua sap xep la:";
  XuatDay(a,n);
  getch();
}
// Đề nghị độc giả chuyển code trên sang các ngôn ngữ lập trình khác


--------------------------------------------
Xem thêm các thuật toán khác: 


[ Sort ] Thuật toán Merge-Sort [Code C++]

 Thuật toán Merge-Sort 


+ Tư tưởng của thuật toán Merge-Sort

Mô tả bài toán: cho 2 danh sách A và B lần lượt có m và n phần tử đã sắp xếp theo thứ tự. Bài toán đặt ra trộn 2 danh sách A và B với nhau thành danh sách C cũng là một danh sách có thứ tự.

+ Thuật toán:

Bước 1: khởi tạo ba chỉ số chạy trong vòng lặp i = 0, j = 0, k = 0 tương ứng cho ba mảng A, B và C.
Bước 2: tại mỗi bước nếu cả hai chỉ số (i<m và j<n) ta chọn min(A[i],B[j]) và lưu nó vào trong C[k]. Chuyển sang Bước 4.
Bước 3: tăng giá trị k lên 1 và quay về Bước 2.
Bước 4: sao chép tất cả các giá trị còn lại từ các danh sách mà chỉ số còn vi phạm (tức i<m hoặc j<m) vào trong mảng C.

Hình minh họa:
Thuật toán Merge-Sort

+ Cài đặt thuật toán [Code C++]

#include <iostream.h>
#include <conio.h>
#define max 100
// nhap day
void NhapMang(int A[],int n) {
for(int i=0; i<n; i++) {
cout<<"Phan tu "<<i<<" = ";
cin>>A[i];
}
}
// in day
void XuatMang(int A[],int n) {
cout<<endl;
for(int i=0; i<n; i++)
cout<<A[i]<<"\t";
}
// merge sort
void MergeSort(int m, int n, int &k, int A[], int B[], int C[]) {
int i = 0, j = 0;
k = 0;
while (i < m && j < n) {
if (A[i] <= B[j]) {
C[k] = A[i];
i++;
}
else
{
C[k] = B[j];
j++;
}
k++;
}
if (i < m) {
for (int p = i; p < m; p++) {
C[k] = A[p];
k++;
}
}
else
{
for (int p = j; p < n; p++) {
C[k] = B[p];
k++;
}
}
}
// ham main
void main() {
int A[max],B[max],C[max],n,m,k;
clrscr();
cout<<"\n Nhap so phan tu cua day A: n = ";
cin>>n;
cout<<"\n Nhap so phan tu cua day B: m = ";
cin>>m;
cout<<"Nhap day A:\n";
NhapMang(A,m);
cout<<"Nhap day B:\n";
NhapMang(B,n);
cout<<"\n => Sap xep tron 2 mang A, B \n";
MergeSort(m,n,k,A,B,C);
XuatMang(C,k);
getch();
}
//==============================


--------------------------------------------
Xem thêm các thuật toán khác: 


------------------------
Tự học lập trình C++:

------------------------

Bài 1: Chương trình đầu tay
Bài 2: Các kiểu dữ liệu cơ bản chuần trong C\C++
Bài 3: Nhập, Xuất trong C/C++
Bài 4: Cấu trúc rẽ nhánh (IF)
Bài 5: Cấu trúc lặp for
Bài 6: Cấu trúc lặp while
Bài 7: Cấu trúc lặp do ... while
Bài 8: Cấu trúc lựa chọn switch... case
Bài 9: Dữ liệu kiểu mảng (array)
Bài 10: Dữ liệu kiểu cấu trúc (struct)
Bài 11: Hàm (function)
Bài 12: Dữ liệu kiểu con trỏ (pointer)
Bài 13: Xử lý tệp tin (file)
Bài 14: Lập trình hướng đối tượng (OOP) với C++


Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]



Chúc các bạn thành công!

 

[ Sort ] Thuật toán Heap-Sort [Code C++]

Thuật toán sắp xếp vun đống - heap sort


+ Tư tưởng của thuật toán Heap-Sort (săp xếp vun đống)

Ta xem danh sách n phần tử a1, a2, a3, ... an  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 (đống) 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ự.

>> Giáo Trình C++ Và Lập Trình Hướng Đối Tượng

Ví dụ: xét danh sách trước khi sắp xếp



+ Cài đặt thuật toán [Code Tubor C++]

#include <iostream.h>
#include <conio.h>
#define max 100
// nhap day
void NhapMang(int A[],int n) {
for(int i=0; i<n; i++) {
cout<<"nhap Phan tu thu A["<<i<<"] =";
cin>>A[i];
}
}
// in day
void XuatMang(int A[],int n) {
cout<<endl;
for(int i=0; i<n; i++)
cout<<A[i]<<"\t";
}
// doi cho 2 so
void Swap(int &a,int &b) {
int temp = a;
a = b;
b = temp;
}
//hoan vi nut cha thu i phai lon hon nut con (vun dong)
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);
}
}
//xay dung Heap sao cho moi nut cha luon lon hon nut con tren cay (tao cay)
void BuildHeap(int A[], int n) {
for(int i = n/2-1; i>=0; i--)
Heapify(A,n,i);
}
// heap-sort
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);
}
}
// ham main
void main() {
int A[max], n;
clrscr();
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();
}

//======================================

--------------------------------------------
Xem thêm các thuật toán khác: 


------------------------
Tự học lập trình C++:

----------
 

Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]



Chúc các bạn thành công!

 

[ Sort ] Thuật toán Quick - Sort [ code C++ ]

Thuật toán sắp xếp nhanh - Quick Sort 


+ Ý tưởng thuật toán

Xét dãy n phần tử a1, a2, a3, .... an.
Bước 1: chọn khóa pivot (chốt): a(Left + Righ)/ 2.
Bước 2: Phân vùng. Những phần tử nhỏ hơn khóa thì nằm bên trái của khóa, những phần tử lớn hơn khóa thì nằm bên phải của khóa và những phần tử bằng khóa có thể nằm bất cứ chỗ nào trên dãy.
Bước 3: sắp xếp cho cả hai phân vùng mới bên trái và bên phải.

+ Mô tả hoạt động của thuật toán Quick Sort:

Thuật toán Quick - Sort

+ Cài đặt thuật toán  [ Code Tubor C++  ]
#include <iostream.h>
#include <conio.h>
#define max 100
// nhap mang
void NhapMang(int A[],int n) {
for(int i=0; i<n; i++) {
cout<<"nhap Phan tu thu A["<<i<<"] =";
cin>>A[i];
}
}
// in mang
void XuatMang(int A[],int n) {
cout<<endl;
for(int i=0; i<n; i++)
cout<<A[i]<<"\t";
}
// doi cho 2 so
void Swap(int &a,int &b) {
int temp = a;
a = b;
b = temp;
}
// thuat toan quick-sort
void QuickSort(int A[], int Left, int Right) {
int i = Left, j = Right;
int pivot = A[(Left + Right) / 2];
/* partition */
while (i <= j) {
while (A[i] < pivot)
i++;
while (A[j] > pivot)
j--;
if (i <= j) {
Swap(A[i],A[j]);
i++;
j--;
}
}
/* recursion */
if (Left < j)
QuickSort(A, Left, j);
if (i < Right)
QuickSort(A, i, Right);
}
// ham main
void main() {
int A[max], n;
clrscr();
cout<<"Nhap so phan tu:";
cin>>n;
NhapMang(A,n);
cout<<"\nMang vua nhap la:";
XuatMang(A,n);
cout<<"\nSap xep theo Quick Sort:";
QuickSort(A,0,n-1);
XuatMang(A,n);
getch();
}
//======================================


--------------------------------------------
Xem thêm các thuật toán khác: 


------------------------
Tự học lập trình C++:

------------------------

Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]


Bài 1: Chương trình đầu tay

[ Android ] Cài đặt Android SDK, Eclipse và thiết bị giả lập AVD (Android Virtual Device)


Thực hiện cài đặt theo các bước:

Bước 1: Cài đặt Android SDK (Software Development Kit)

- Tải về Android SDK (Software Development Kit) > http://developer.android.com/sdk/index.html

- Bước cài đặt Android SDK sẽ giúp chúng ta cài đặt thiết bị giả lập Android trên máy tính. Việc thiết lập môi trường giả để: test chương trình, hoặc phần mềm thay thế cho thiết bị thật.

- Khi tải Android SDK về, chúng ta tiến hành giải nén vào bất kỳ đâu cũng được. Nên giải nén các tools phát triển trên cùng thư mục.

Bước 2: Cài đặt Eclipse IDE (công cụ lập trình Java)

- Tải Eclipse IDE (Java) > http://www.eclipse.org/downloads/

- Ở đây chúng ta có thể lựa chọn Eclipse hoặc Netbean. Tuy nhiên, theo khuyến cáo của google và kinh nghiệm bản thân, em nghĩ nên chọn Eclipse.

- Sau khi tải về Eclipse, tiến hành giải nén Eclipse. Bạn nên giải nén các tools phát triển trên cùng thư mục.

Bước 3:  Cài đặt Android Development Tools (ADT) plugin cho Eclipse

- Mở Eclipse

>> Vào Help > Install New Software (hoặc Software Updates với các phiên bản cũ hơn)
>> Chọn Tab Available software
>> Chọn Add Site

( Có thể vào trực tiếp đây để download ADT về: http://developer.android.com/tools/sdk/eclipse-adt.html#downloading (chọn Archive) )

Hoặc nhập địa chỉ sau: https://dl-ssl.google.com/android/eclipse/

Nếu ko được: https://dl-ssl.google.com/android/eclipse/


- Chọn tất cả các gói. >> Nhấn Next là Ok


 - Chấp nhận thỏa thuận rồi Finish


- Quá trình cài (mất một chút thời gian)


Bước 4: Kết nối Android SDK với Eclipse IDE

Thực hiện việc kết nối SDK với Eclipse :
>> Chọn Windows > Preference menu
>> Chọn Android từ cây danh mục bên trái
>> Nhập SDK Location: là thư mục giải nén SDK đã thực hiện được ở bước 1


Đến bước này có thể nói đã hoàn thiện các bước chính để cài đặt SDK và eclipse. Để chọn lựa API và Emulator, chúng ta vào thư mục android-sdk-windows (thư mục đã cài đặt ở step 1), chạy file SDK Manager.exe.

Chú ý: chạy file này bằng quyền Administrator trên windows. SDK Manager giúp chúng ta quản lý SDK Tools, SDK Platform Tools (Update, New…), các API và các AVD (Android Virtual Device)…

Tại đây, chúng ta có thể chọn Android version để phát triển. Xem chi tiết các android version: http://developer.android.com/about/index.html .

Ví dụ: 
  Android 4.1 tương ứng API16,
  Android 4.0.3 – API15,
  Android2.2 - API8...

Ở đây chúng ta có thể xem mô tả chi tiết cho End user hoặc cho Developer. API guide chắc chắn sẽ là những kiến thức rất cần thiết với những bạn Developer.

Sau khi đã thiết lập xong, vào Tools > Manager AVDs để tạo virtual device.

>>>> Khi cài xong mở Eclipse xuât hiện các icon Android


Chúc thành công!

*******

Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Giáo trình: Lập Trình Android [Click để xem]

# Khoá học online:  Lập trình Android toàn tập [Click để xem]

[TxT]