[英]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;
}
請記住,我刪除了我的大學給我的基本模板,因此此處未顯示放入訂單的實際數據,但我看不出這如何影響效率
您應該嘗試幾件事:
向量Order
中的 object 。
您應該更喜歡移動它而不是復制它。
您繼續為臨時緩沖區c
重新分配空間。
分配一次臨時緩沖區並重新使用。
當您知道索引不能超出范圍時,請勿使用at()
。
使用operator[]
因為它不做范圍檢查的額外工作。
如果您不需要,請勿復制回原始位置:
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.