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();
}
Đỗ Trung Quân viết 18:16 ngày 30/09/2018

Mình chạy thử thấy có 2 lỗi.

Nguyễn Minh Dũng viết 18:03 ngày 30/09/2018

Lỗi gì thế @Is2IT, nhìn trên hình ko hiểu gì hết hehe

Đỗ Trung Quân viết 18:05 ngày 30/09/2018

Đó 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 ^^

Nguyễn Minh Dũng viết 18:12 ngày 30/09/2018

@ndth xem lại giải thuật xem, @Is2IT tìm ra lỗi rồi kìa.

AnNdth viết 18:18 ngày 30/09/2018

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

Bài liên quan
0