Quick sort는 Stable하지 않다.
먼저 "기준점"을 잡는다. 여기서는 5를 기준으로 잡아줌.
(pivot설정은 지 마음대로임. 8을 해도되고 상관없음..)
low ->, <- high 화살표 방향대로 이동을 할 것이다.
먼저 low부터 보면은 pivot보다 작을 경우 ++low를 진행시켜준다.
그러다가 pivot보다 큰 데이터를 만나면 low 증가를 멈추고 정지한다.
이후 high와 pivot의 데이터 비교를 시작한다.
high가 pivot보다 클 경우 --high를 계속 진행한다.
계속 당기다가 여기서 멈춘다. high가 가르키는 데이터가 pivot보다 작으니까.
low index가 high index보다 작다면은 데이터를 교체를 해준다.
이렇게 교체를 함 ㅇㅇ.
이후 1단계를 다시 반복을 하면은
이렇게 된다.
다시 low, high index를 비교후
데이터를 교체를 해준다.
그다음 다시 1단계 -> 2단계 진행을 하면은
low, high가 역전을 하는 상황이 발생을 하는데 이게 알고리즘 끝이다. => 3단계 진행을 한다.
1~2단계를 반복을 하다가 low, high의 index가 역전이 발생했을 때
pivot의 데이터와 high의 데이터를 swap해준다.
이게 끝임.
pivot보다 작은 애들은 swap하고 나서의 pivot위치의 왼쪽에, 5보다 큰 애들은 싹다 오른쪽으로 밀림.
이것을 재귀적으로 호출하면 된다.
중간에 && 뒤에서 pivot >= v[low] 접근을 하고있는데 이러면 안됨.
int Partition(std::vector<int>& v, int left, int right)
{
int pivotData = v[left];
int pLeft = left + 1;
int pRight = right;
while (pLeft <= pRight)
{
while (pLeft <= right && pivotData >= v[pLeft])
++pLeft;
while (pRight >= left + 1 && pivotData <= v[pRight])
--pRight;
if (pLeft < pRight)
std::swap(v[pLeft], v[pRight]);
}
std::swap(v[left], v[pRight]);
return pRight;
}
void QuickSort(std::vector<int>& v, int left, int right)
{
if (left > right)
return;
int pivotIdx = Partition(v, left, right);
QuickSort(v, left, pivotIdx - 1);
QuickSort(v, pivotIdx + 1, right);
}
recursive하게 함수를 절반, 절반 호출 하기 위해서
처음에 Partition을 진행해준뒤 pivot Index를 얻어와서
다시 QuickSort를 진행을 해준다.
데이터가 N개 있다고 가정을 할 때
코드가 이중 while로 되어있기는 하지만
low가 이동하는 방향은 ++ -> 로 N번 이동을 하고
high가 이동을 하는 방향응 <- -- 로 N번을 이동을 하기 때문에 일단은 O(N log N)이다.
항상 최소값을 pivot으로 잡거나
항상 최대값을 pivot으로 잡는 경우.