Code C/C++: Thuật toán sắp xếp trộn (Merge Sort)

Người đăng: vuivengay on Thứ Tư, 25 tháng 6, 2014

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.
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;
}
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++;
}
}

//Chương trình chính
int main(){
int A[max],B[max],C[max],n,m,k;
cout<<"m = "; cin>>m;
cout<<"n = "; cin>>n;
cout<<"Nhap danh sach co thu tu A:\n";
NhapMang(A,m);
cout<<"Nhap danh sach co thu tu B:\n";
NhapMang(B,n);
cout<<"\nSap xep tron 2 mang A, B\n";
MergeSort(m,n,k,A,B,C);
XuatMang(C,k);
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, merge sort
More about

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

Người đăng: vuivengay

Ý 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
More about

Code C/C++: Thuật toán sắp xếp nhanh (QuickSort)

Người đăng: vuivengay

Ý tưởng thuật toán: xét dãy n phần tử a0, a1, …,an-1
Bước 1: Chọn khóa pivot = a(left+right)/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 3Sắ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:

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;
}
//Sắp xếp các phần tử
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);
}

//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 QuickSort:";
QuickSort(A,0,n-1);
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
More about

Code C/C++: Thuật toán sắp xếp chèn (Insertion Sort)

Người đăng: vuivengay on Thứ Ba, 24 tháng 6, 2014

Ý tưởng thuật toán: xét dãy n phần tử a0, a1, …,an-1
- Xem dãy gồm 1 phần tử là a0 dãy có thứ tự.
- Thêm a1 vào dãy có thứ tự a0 sao cho dãy mới a0, a1 là dãy có thứ tự. Nếu a1 < a0  ta hoán vị avới a0.
- Thêm a2  vào dãy có thứ tự a0, a1 sao cho dãy mới a0, a1, a2 là dãy có thứ tự.
- Tiếp tục như thế đến n-1 bước ta sẽ có dãy có thứ tự a0, a1, …,an-1
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.
Cài đặt thuật toán:
#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; 
}
//Thủ tục 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]);
}
//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<<endl;
InsertionSort (A,n);
cout<<"\nMang vua sap xep la:";
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
More about

Code C/C++: Thuật toán sắp xếp lựa chọn (Selection Sort)

Người đăng: vuivengay

Ý tưởng thuật toán: xét dãy n phần tử a0, a1, …,an-1
- Chọn trong dãy a0, a1, …,an-1 ra phần tử có khóa nhỏ nhất và hoán vị nó với a0.
- Chọn trong dãy a1, a2, …,an-1 ra phần tử có khóa nhỏ nhất và hoán vị nó với a1.
- Cứ 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}.
Cài đặt thuật toán:
#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;
}
//Thuật toán Selection Sort
void SelectionSort(int A[],int n) {
int min;        
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]);
}
}
//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<<endl;
SelectionSort (A,n);
cout<<"\nMang vua sap xep la:";
XuatMang(A,n);
getch();
return 0;

}
Kết quả chạy chương trình:

Tag: Sắp xếp,Bubble sort, thuật toán, sắp xếp lựa chọn, Selection Sort
More about

Code C/C++: Thuật toán sắp xếp nổi bọt (Bubble Sort Algorithm)

Người đăng: vuivengay on Thứ Hai, 23 tháng 6, 2014


Ý 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.

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 chương trình:
#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;
}
//Sắp xếp các phần tử theo Bubble Sort
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]);
}
//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<<endl;
BubbleSort(A,n);
cout<<"\nMang vua sap xep la:";
XuatMang(A,n);
getch();
return 0;
}
Kết quả chương trình:

Từ khóa: Sắp xếp, nổi bọt, Bubble sort, thuật toán.
More about

Cài đặt: Hướng dẫn cài đặt Microsoft SQL Server 2005 (bằng hình ảnh)

Người đăng: vuivengay on Thứ Ba, 17 tháng 6, 2014

Bước 1. Đưa đĩa CD cài đặt vào ổ đĩa, chương trình sẽ tự động hiển thị giao diện như hình:

Bước 2. Lựa chọn Server components, tools, Books Online and Samples.

Bước 3. Đánh dấu vào lựa chọn I accept the licensing terms and conditions để đồng ý với điều khoản giấy phép sử dụng của Microsoft trước khi tiến hành cài đặt. Sau đó chọn OK.

Bước 4. Click nút Install để cài đặt các thành phần cập nhật cần thiết trước khi cài SQL Server.

Bước 5. Sau khi cài đặt thành công nhấn nút Next.

Bước 6. Quá trình cài đặt sẽ kiểm tra cấu hình của hệ thống (System Configuration Check).

Bước 7. Màn hình Welcome to the Microsoft SQL Server Installation Wizard xuất hiện. Nhấn Next để sang bước tiếp theo.

Bước 8. Quá trình kiểm tra cấu hình hệ thống bắt đầu chạy. Trong bước này, màn hình sẽ hiển thị các cảnh báo hoặc lỗi mà bạn sẽ gặp phải. Nếu cột status có thông báo successfull như hình dưới thì bạn nhấn Next để tiếp tục. Những warning (cảnh báo) sẽ không quá quan trọng, và bạn có thể bổ sung trong quá trình cài đặt.

Bước 9. Điền đầy đủ thông đăng ký trong mục Name, Company, Product Key. Sau đó nhấn Next.

Bước 10. Đánh dấu vào các mục chọn SQL Server Database Services, Reporting Services, Workstation components, Books Online and development tools để cài đặt các dịch vụ cần thiết. Sau đó nhấn Next.

Bước 11. Chọn Named instance và nhập tên thể hiện vào đó, ở đây chọn infinity (chỗ này chọn tùy ý). Sau đó nhấn Next.

Bước 12. Chọn như hình dưới, đánh dấu vào các mục chọn. Sau đó nhấn Next.

Bước 13. Có 2 lựa chọn chế độ xác thực. Windows Authentication Mode - chế độ xác thực dựa vào xác thực của Windows và Mixed Mode - chế độ xác thực dựa vào xác thực của Windows và SQL Server, nếu lựa chọn chế độ này, ta có tài khoản mặc định là sa, bạn nhập mật khẩu và xác nhận mật khẩu bên dưới. Ở đây, chúng ta lựa chọn Windows Authentication để cho quá trình thực hành được đơn giản. Sau đó nhấn Next.

Bước 14. Chọn SQL Collations như hình bên dưới. Sau đó nhấn Next.

Bước 15. Chọn Install the default configuration để chọn chế độ cài đặt mặc định. Sau đó nhấn Next.

Bước 16. Nhấn Install để bắt đầu quá trình cài đặt


More about

Code C/C++: Tính định thức của ma trận

Người đăng: vuivengay on Thứ Hai, 16 tháng 6, 2014

Ý tưởng thuật toán: ta tiến hành phân rã ma trận A=L.U.
Ta có: Det(A)=Det(L)*Det(U) mà Det(L) = 1 nên Det(A) = Det(U)
Cài đặt thuật toán:
#include <conio.h>
#include <iostream>
#define max 100
using namespace std;
/* Nhập ma trận */
void Nhap(float A[max][max],int n) {
for(int i = 0; i<n; i++)
for(int j = 0; j<n; j++) {
cout<<"a["<<i<<"]["<<j<<"] = ";
cin>>A[i][j];
}
}
/* Xuất ma trận */
void XuatMaTran(float A[max][max], int n){
cout<<"\n";
for(int i=0 ; i<n; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
cout<<A[i][j]<<"\t";
}
}
/* Phan ra A = LU */
void PhanRaLU(float A[max][max], float L[max][max], float U[max][max], int n) {
for(int k = 0; k<n;k++) {
U[k][k] = A[k][k];
L[k][k] = 1;
for(int i=k+1; i<n; i++) {
L[i][k] = A[i][k]/U[k][k];
U[k][i] = A[k][i];
U[i][k] = 0;
L[k][i] = 0;
}
for(int i = k+1; i<n; i++)
for(int j = k+1; j<n; j++)
A[i][j] = A[i][j]-L[i][k]*U[k][j];
}
}
// Định thức ma trận tam giác
double DinhThucMaTranTamGiac(float A[max][max], int n)
double temp = 1;
for(int i = 0; i<n; i++)
temp*=A[i][i];
return temp;
}
/* Chương trình chính */
int main() {
int n;
float A[max][max],L[max][max],U[max][max];
cout<<"Nhap n = ";  cin>>n;
cout<<"Nhap ma tran A\n";
Nhap(A,n);
cout<<"Ma tran A vua nhap";
XuatMaTran(A,n);
PhanRaLU(A,L,U,n);
cout<<"\nMa tran L";
XuatMaTran(L,n);
cout<<"\nMa tran U";
XuatMaTran(U,n);
cout<<"\nDet(A) = Det(L)*Det(U) = "<<DinhThucMaTranTamGiac(U,n);
getch();
return 0;

}
Kết quả chạy chương trình:
Tag: C, C++, Hệ phương trình tuyến tính, Định thức của ma trận, det, matrix
More about

Code C/C++: Giải hệ phương trình tuyến tính dựa vào phân rã LU

Người đăng: vuivengay

Ý tưởng thuật toán: cho hệ phương trình tuyến tính tổng quát A.X=B. Ta tiến hành phân rã A=L.U. Trong đó, L là ma trận tam giác dưới và U là ma trận tam giác trên.
Khi đó,
Cài đặt chương trình:
#include <conio.h>
#include <iostream>
#define max 100
using namespace std;
/* Nhập ma trận hệ số */
void Nhap(float A[max][max],int n) {
for(int i = 0; i<n; i++)
for(int j = 0; j<n; j++){
cout<<"a["<<i<<"]["<<j<<"] = ";
cin>>A[i][j];
}
}
/* Nhập ma trận hệ số tự do */
void Nhap(float B[max],int n) {
for(int i = 0; i<n; i++) {
cout<<"b["<<i<<"] = ";
cin>>B[i];
}
}
/* Xuất ma trận hệ số tự do */
void Xuat(float B[max],int n) {
cout<<"(";
for(int i = 0; i<n-1; i++)
cout<<B[i]<<",";
cout<<B[n-1]<<")";
}
/* Xuất ma trận */
void Xuat(float A[max][max], int n) {
cout<<"\n";
for(int i=0 ; i<n; i++){
cout<<endl;
for(int j=0 ; j<n; j++)
cout<<A[i][j]<<"\t";
}
}
/* Xuất nghiệm */
void XuatNghiem(float X[], int n, char * s)  {
cout<<"\nNghiem cua he PTTT";
for(int i=0; i<n; i++)
cout<<s<<i+1<<"="<<X[i];
}
char HeTamGiacDuoi (float A[max][max], float X[max], float B[max], int n ) {
for(int i = 0; i<n; i++) {
if (A[i][i]!=0) {
if (i==0)
X[i] = B[i]/A[i][i];
else {
X[i] = B[i];
for(int j=0; j<i; j++)
X[i]=X[i]-A[i][j]*X[j];
X[i] = X[i]/A[i][i];
}
} else
return 0;
}
return 1;
}
char HeTamGiacTren (float A[max][max], float X[max], float B[max], int n ) {
for(int i = n-1; i>=0; i--) {
if (A[i][i]!=0) {
if (i==n-1)
X[i] = B[i]/A[i][i];
else {
X[i] = B[i];
for(int j=i+1; j<n; j++)
X[i]=X[i]-A[i][j]*X[j];
X[i] = X[i]/A[i][i];
}
} else
return 0;
}
return 1;
}
void PhanRaLU(float A[max][max], float L[max][max], float U[max][max], int n){
for(int k =0; k<n; k++) {
U[k][k] = A[k][k];
L[k][k] = 1;
for(int i=k+1; i<n; i++) { 
L[i][k] = A[i][k]/U[k][k];
U[k][i] = A[k][i];
U[i][k] = 0;
L[k][i] = 0;
}
for(int i = k+1; i<n; i++)
for(int j = k+1; j<n; j++)
A[i][j] = A[i][j]-L[i][k]*U[k][j];
}
}
/* Giải hệ phương trình tổng quát LUX=B*/
void GiaiHePTTT(float A[max][max], float X[max], float B[max], int n) {
float L[max][max],U[max][max], Y[max];
cout<<"Phan ra A = L.U\n";
PhanRaLU(A,L,U,n);
cout<<"Ma tran L";
Xuat(L,n);
cout<<"\nMa tran U";
Xuat(U,n);
cout<<"\nGiai LY = B. Nghiem Y";
if(HeTamGiacDuoi(L,Y,B,n)) {
XuatNghiem(Y,n,"\ny");
cout<<"\nGiai UX = Y. Nghiem X";
if(HeTamGiacTren(U,X,Y,n))
XuatNghiem(X,n,"\nx");
else
cout<<"\nHe pttt k co nghiem duy nhat";
} else
cout<<"\nHe pttt k co nghiem duy nhat";
}
int main() {
int n;
float A[max][max],B[max], X[max];
cout<<"Nhap so he phuong trinh n = "; cin>>n;
cout<<"Nhap ma tran he so A\n";
Nhap(A,n);
cout<<"Nhap ma tran he so tu do B\n";
Nhap(B,n);
GiaiHePTTT(A,X,B,n);
getch();
return 0;


Kết quả chạy chương trình:

More about