01/10/2018, 10:05

Sort() và sort_heap() trong c++ cái nào nhanh hơn?

Cho em hỏi là tại sao trong một vài trường hợp sort() lại cho ra thời gian nhanh hơn sort_heap() ạ. Ví dụ trong code này, em chỉ sắp xếp tăng dần một vector struct gồm hai số nguyên, hàm so sánh chỉ so sánh một đại lượng trong struct thì sort_heap() cho thời gian 0.261s còn sort() cho thời gian chỉ 0.131s (với test n = 100000)

#include <bits/stdc++.h>

using namespace std;

struct data {
    int u, p;
};

int cmpfunc (const data &a, const data &b)
{
   return (a.u - b.u);
}

bool cmp (data x, data y){
    return (x.u < y.u);
}

int main()
{
    system("cls");
    fstream f;
    f.open("HOUGH.INP", ios::in);
    int n,m;
    f >> n >> m;
    vector<data> a,b; int j; data pr;
    for (int i = 1; i<=n; i++){
        f >> j; pr.u = j; pr.p = i-1;
        a.push_back(pr);
    }
    for (int i = 1; i<=m; i++) {
        f >> j; pr.u = j; pr.p = i-1;
        b.push_back(pr);
    }
    f.close();
    sort_heap(a.begin(), a.end(), cmp);
    sort_heap(b.begin(), b.end(), cmp);
    return 0;
}

Còn trong code sau, sắp xếp tăng dần vector struct gồm 3 đại lượng int, hàm so sánh 2 đại lượng trong đó, thì sort() chạy quá thời gian còn sort_heap() chỉ tổn 0.220s (test n = 100000).

#include <bits/stdc++.h>

using namespace std;

struct datatype {
    int u,v,c;
};

bool cmp(const datatype a, const datatype b) {
    if (a.u > b.u) return false;
    if (a.u < b.u) return true;
    if (a.v > b.v) return false;
    return true;
}

int main()
{
    system("cls");
    fstream f;
    f.open("input.txt", ios::in);
    int n;
    f >> n;
    vector<datatype> data(n);
    for (int i = 0; i<n; i++) {
        f >> data[i].u >> data[i].v >> data[i].c;
    }
    sort_heap(data.begin(), data.end(), cmp);
    return 0;
}

Cho em hỏi là vì sao ạ? Em mới học C++ nên chưa rành lắm. Dạ tiện cho em hỏi là nên dùng hàm sort nào để đỡ tốn thời gian và an toàn nhất ạ? Em thấy có hàm qsort bên C nhưng em xây mãi không được, cứ bị vướng chỗ hàm compare ấy ạ. Cảm ơn mọi người nhiều ạ!
P/s: Vì em đang luyện thi hsg nên thời gian chạy đối với e khá quan trọng ạ. Mong mọi người giúp đỡ e

viết 12:10 ngày 01/10/2018

sort() nhìn chung lẹ nhất. Mấy ông viết thư viện ko bị ngu đâu mà cái hàm sắp xếp mặc định có tên là sort() nghĩa là sắp xếp, mà ko ghi quicksort() hay mergesort() v.v… Nếu sort() ko lẹ thì vứt đừng xài C++ nữa.

sort_heap() bắt mảng đưa vào phải có cấu trúc như 1 heap (phải gọi make_heap() trước). đúng như tên gọi của nó là sắp xếp 1 cái heap. Nếu ko kết quả ko được sắp xếp đúng. Mấy cái ví dụ trên đâu có make_heap() đâu nên nó lẹ hơn là đúng rồi, nhưng mảng đầu ra có được sắp xếp tăng/giảm dần hay ko thì trời biết.

rogp10 viết 12:17 ngày 01/10/2018

Nhìn chung chỉ xài heap sort thì ẹ hơn là quick sort + heap sort để backup. std::sort() theo hướng này là nhiều.

Bài liên quan
0