30/09/2018, 16:02
CTDL và GT - Một số thuật toán tìm kiếm và sắp xếp
#include <iostream>
#include <fstream>
#define MAX 20
using namespace std;
class DaySo
{
private:
int a[MAX];
int n;
public:
void Menu();
void Nhap();
void Ghi();
void Xuat(int[], int);
void TimKiemTuyenTinh (int[], int);
void TimKiemNhiPhan (int[], int);
void InterchangeSort (int[], int);
void SelectionSort (int[], int);
void InsertSort (int[], int);
void BubleSort (int[], int);
};
void DaySo::Nhap()
{
cout << "Nhap n: ";
cin >> n;
for (int i=0; i<n; i++)
{
cout << "Nhap phan tu thu " << i << " : ";
cin >> a[i];
}
cout << endl;
}
void DaySo::Ghi()
{
ofstream f("DaySo.txt");
f << n << endl;
for (int i=0; i<n; i++)
f << a[i] << ' ';
}
void DaySo::Xuat(int a[], int n)
{
for (int i=0; i<n; i++)
cout << a[i] << ' ';
cout << endl;
}
void DaySo::TimKiemTuyenTinh (int a[], int n)
{
int x, i = 0;
cout << "Nhap so can tim: ";
cin >> x;
while ( (i<n) && (a[i] != x) )
i++;
if (i == n)
cout << "Khong tim thay " << x << endl;
else
cout << x << " nam o vi tri thu " << i << endl;
}
void DaySo::TimKiemNhiPhan (int a[], int n)
{
int x;
cout << "Nhap phan tu can tim: ";
cin >> x;
InterchangeSort(a,n);
int left, right, mid;
left = 0;
right = n-1;
do
{
mid = (right + left)/2;
if (a[mid] == x)
{
cout << x << " nam o vi tri thu " << mid << endl;
break;
}
else if (a[mid] > x)
right = mid - 1;
else left = mid + 1;
}while(left<=right);
}
void DaySo::InterchangeSort(int a[], int n)
{
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
if (a[i] > a[j])
swap(a[i], a[j]);
Ghi();
Xuat(a,n);
}
void DaySo::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[j] < a[min])
min=j;
swap(a[min], a[i]);
}
Ghi();
Xuat(a,n);
}
void DaySo::InsertSort(int a[], int n)
{
int pos, x;
for (int i=1; i<n-1; i++)
{
x = a[i];
pos = i-1;
while ((pos>=0) && (a[pos] > x))
{
a[pos+1] = a[pos];
pos--;
}
a[pos+1] = x;
}
Ghi();
Xuat (a, n);
}
void DaySo::BubleSort(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] , a[j-1]);
Ghi();
Xuat(a,n);
}
void DaySo::Menu()
{
int c;
char tt;
do
{
Nhap();
Ghi();
cout << endl << "----------------MENU----------------" << endl;
cout << "1. Tim Kiem Tuyen Tinh" << endl;
cout << "2. Tim Kiem Nhi Phan" << endl;
cout << "3. Interchange Sort - Doi Cho Truc Tiep" << endl;
cout << "4. Selection Sort - Chon Truc Tiep" << endl;
cout << "5. Insert Sort - Chen Truc Tiep" << endl;
cout << "6. Buble Sort - Thuat Toan Noi Bot" << endl;
cout << "0. Exit" << endl;
cout << "Moi ban chon: ";
cin >> c;
switch(c)
{
case 1:
TimKiemTuyenTinh(a,n);
break;
case 2:
TimKiemNhiPhan(a,n);
break;
case 3:
InterchangeSort (a,n);
break;
case 4:
SelectionSort (a,n);
break;
case 5:
InsertSort (a,n);
break;
case 6:
BubleSort (a,n);
break;
case 0:
break;
}
cout << "Ban co muon tiep tuc Yes(y) or No(n)??? ";
cin >> tt;
}while ( (tt == 'y') || (tt == 'Y') );
}
void main()
{
DaySo x;
x.Menu();
}
Bài liên quan
Mình chạy thử thấy có 2 lỗi.
Lỗi gì thế @Is2IT, nhìn trên hình ko hiểu gì hết hehe
Đó anh. Em nhâp 2 lần 4 số 3 2 1 3 giống hệt nhau.
Lần 1 nhập 5. không hiển thị 1 2 3 3 mà là 0 0 3 3
Lần 2 nhập 4. không chạy chương trình ^^
@ndth xem lại giải thuật xem, @Is2IT tìm ra lỗi rồi kìa.
Mình đã fix lỗi rồi đó. Tối qua đăng lên mà k kt kĩ, cám ơn bạn nhiền nha