2013-08-17 2 views
0

По какой-то причине мне понадобилось некоторое время, чтобы окунуться в это, но есть один бит, о котором я до сих пор не уверен.C++ быстрый запрос сравнения сортировки

В приведенном ниже коде, этот бит:

a.at(first) = a.at(last); 
a.at(last) = a.at(++first); 
a.at(first) = pivot; 

Мой вопрос, когда a.at (++ первая) поменялись местами с a.at (последний), он не сравнивались, имеет Это? a.at (last) ниже, чем точка поворота, поэтому перемещается, но нет способа узнать, является ли a.at (++ first) больше или равно оси pivot, есть ли? Или я чего-то не хватает?

#include <iostream> 
#include <vector> 

using namespace std; 

void quick(vector<int>&); 
void quick_helper(vector<int>&, int, int); 
void print(vector<int>); 

int main(){ 

    vector<int>v(10); 
    v.at(0) = 8; 
    v.at(1) = 3; 
    v.at(2) = 7; 
    v.at(3) = 2; 
    v.at(4) = 5; 
    v.at(5) = 9; 
    v.at(6) = 1; 
    v.at(7) = 4; 
    v.at(8) = 0; 
    v.at(9) = 6; 

    cout << "Before sorting:\n"; 
    print(v); 
    quick (v); 
    cout << "After sorting:\n"; 
    print(v); 

    return 0; 
} 
void print(vector<int> a) 
{ 
    for (int i = 0; i < static_cast<int>(a.size()); i++) 
     cout << a[i] << " "; 
    cout << "\n"; 
} 
void quick(vector<int>& a){ 
    quick_helper(a, 0, static_cast<int>(a.size() - 1)); 
} 
void quick_helper(vector<int>& a, int l, int r){ 
    int i, first, last, pivot; 

    if (r>l){ 
     first = l; 
     last = r; 
     i = (l+r)/2; 
     pivot = a.at(i); 
     a.at(i) = a.at(first); 
     a.at(first) = pivot; 

     while (last > first){ 
      if (a.at(last) >= pivot){ 
       last--; 
      } else { 
       a.at(first) = a.at(last); 
       a.at(last) = a.at(++first); 
       a.at(first) = pivot; 
      } 
     } 

     pivot = first; 
     quick_helper(a, l, pivot-1); 
     quick_helper(a, pivot+1, r); 
    } 
    return; 
} 
+0

Возможно, его легче понять, если вы проведете через него небольшой массив (например, 7 элементов) на бумажной подушке. Вы будете удивлены, как это поможет вам понять, как все работает. [См. Здесь для примера] (http://ideone.com/G2hEQ6) традиционного алгоритма быстрой сортировки на месте, как описано в Wiki. Он работает практически так же, как и ваша реализация, но заполняет слева направо, чтобы найти опорный слот, в котором вы заполняете справа налево. Идея, тем не менее, та же. Желаю вам удачи. – WhozCraig

ответ

0

нет никакого способа узнать, если a.at (++ первая) больше или равно поворота

Да вы правы, a.at(++first) просто неизвестное значение, которое принимает место сменного. Он будет сравниваться на следующей итерации цикла while в if (a.at(last) >= pivot) last--.

Это работает, потому что ваш стержень всегда находится в первом положении.

+0

Это отлично, именно то, что я хотел услышать. Спасибо! – jewfro