簡體   English   中英

如何讓我的歸並排序算法更高效

[英]How do I make my merge sort algorithm more efficient

我要保持這個簡短而甜蜜,我有一個大學作業要做,它會通過在線評委,如果時間限制太長(運行所有輸入所需的時間等,那么它就會命中時間限制)

我嘗試過冒泡排序、快速排序、插入排序和歸並排序。

歸根結底,歸並排序似乎是穩定的排序之一,時間復雜度為 Nlog(N),所以我決定堅持使用這個,我的代碼如下:

void merge(vector<Order>& orderVector, int low, int high, int mid)
{
    int i, j, k;
    vector<Order> c(orderVector.size(), orderVector.at(0));
    i = low;
    k = low;
    j = mid + 1;
    while (i <= mid && j <= high) {
        if ((orderVector.at(i).selection_time < orderVector.at(j).selection_time) || (orderVector.at(i).selection_time == orderVector.at(j).selection_time && orderVector.at(i).shipping_time < orderVector.at(j).shipping_time)) {
            c.at(k) = orderVector.at(i);
            k++;
            i++;
        }
        else  {
            c.at(k) = orderVector.at(j);
            k++;
            j++;
        }
    }
    while (i <= mid) {
        c.at(k) = orderVector.at(i);
        k++;
        i++;
    }
    while (j <= high) {
        c.at(k) = orderVector.at(j);
        k++;
        j++;
    }
    for (i = low; i < k; i++)  {
        orderVector.at(i) = c.at(i);
    }
}

void sort(vector<Order>& orderVector, int low, int high)
{
    int mid;
    if (low < high) {
        mid = (low + high) / 2;
        sort(orderVector, low, mid);
        sort(orderVector, mid + 1, high);
        merge(orderVector, low, high, mid);
    }
}

我真的不明白這有什么效率低下,它實際上是您會找到的標准合並排序代碼。 我引用 orderVector 所以它進行了更改,orderVector 只是一個充滿“訂單”類的向量,它只是一個帶有 3 個變量(id、selection_time、shipping_time)的 class

我所做的是我得到 selection_time 並檢查和排序,一旦它們被排序,我確保 shipping_time 僅在 selection_time 相等時排序,這樣它會先對第一個值排序,然后再按第二個值排序。

我覺得這個方法效率很高,我不知道為什么根據這個在線判斷它不選擇高效運行。

打印代碼,以及添加到矢量的代碼(應該重要的是以下)

int main(int argc, char *argv[]){
    string data;
    getline(cin, data);
   
    vector<string> data_v = split(data, "; ", numeric_limits<size_t>::max());

    vector<Order> orderVector;

    for(string d : data_v){
        Order *orders = new Order(id, selection, shipping);

        orderVector.push_back(*orders);
    }

    sort(orderVector, 0, orderVector.size() - 1);

    for(long unsigned int i = 0; i < orderVector.size(); i++)
    {
        cout << orderVector.at(i).id << " ";
    }

    cout << endl;
}

請記住,我刪除了我的大學給我的基本模板,因此此處未顯示放入訂單的實際數據,但我看不出這如何影響效率

您應該嘗試幾件事:

  1. 向量Order中的 object 。
    您應該更喜歡移動它而不是復制它。

  2. 您繼續為臨時緩沖區c重新分配空間。
    分配一次臨時緩沖區並重新使用。

  3. 當您知道索引不能超出范圍時,請勿使用at()
    使用operator[]因為它不做范圍檢查的額外工作。

  4. 如果您不需要,請勿復制回原始位置:

    for (i = low; i < k; i++) { orderVector.at(i) = c.at(i); }

僅在容器分類后需要時才執行此部分。

作為旁注:簡化這一點:

if ((orderVector.at(i).selection_time < orderVector.at(j).selection_time) || (orderVector.at(i).selection_time == orderVector.at(j).selection_time && orderVector.at(i).shipping_time < orderVector.at(j).shipping_time)) {

通過為Order對象定義比較運算符(或將其放入函數中)。

作為旁注:不要將自己限制在vector 根據迭代器定義你的接口。

附帶說明:更喜歡使用標准算法,而不是到處寫循環。

while (j <= high) {
    c.at(k) = orderVector.at(j);
    k++;
    j++;
}
// OR
std::move(iterator_j, iterator_jend, iterator_k);

您也可以要求進行完整的代碼審查

或者你可以看看其他人的嘗試和他們的代碼審查:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM