Quick Sort

2012. 9. 1. 09:39프로그래밍일반

Quick Sort

- 1960년에 C.A.R 호어가 고안함. 불필요한 계산을 제외하는 거의 최고의 정렬 알고리즘이다.  

- 한번 어느원소가 다른값과 비교하므로, 이후 그 원소들과 다시 비교하지 않아도 되기 때문에 빠르다. ( 즉, 하나의 원소를 다른 모든 원소들과 비교하지 않아도 된다.)

- 시간복잡도 : nLog(n) (최악의 경우 log(n^2) )

  (버블소트: log(n^2), 합병정렬: nlog(n) )


컨셉

- Pivot이 될 배열의 한 원소를 선택한다.

- Pivot을 기준으로 큰거나 같은값 배열, 작은값 배열 2개로 나눈다.

- 위에서 나눈 2개의 집단을 다시 Recursive 해서 정렬한다.


Source


#include "stdafx.h"

#include <iostream>


using namespace std;


void Swap(int aData[], int pos1, int pos2);

void Sort(int aData[], int length);


int _tmain(int argc, _TCHAR* argv[])

{

int aData[] = {5,4,1,3,6,9,8,7,10,2};

int length = sizeof(aData)/sizeof(int);

Sort(aData,length); // sort

for(int idx=0; idx<length; idx++) {

cout<<aData[idx]<<" ";

}

cout<<endl;

return 0;

}


// pos1 과 pos2 위치의 데이터 값을 바꾼다.

void Swap(int aData[], int pos1, int pos2) {

int temp = aData[pos2];

aData[pos2] = aData[pos1];

aData[pos1] = temp;

}


// 주어진 위치까지의 데이터를 가지고 분할한다.

void Sort(int aData[], int length) {

if(length<=1) return;

int newPos = 0; //새롭게 나누어지는 위치

int pivot = rand()%length; // pivot의 위치를 랜덤으로 돌린다.(이게 가장 성능이 좋다.)

Swap(aData, pivot, 0); // pitvot의 위치를 맨앞으로 이동


// pivot을 기준으로 작은값들을 앞으로 이동

for(int i=0;i<length; i++) { 

if(aData[i]<aData[0]) {

newPos++;

Swap(aData, newPos,i);

}

}

Swap(aData,0, newPos); // pivot값 원래대로

// 이제 작거나 같은값 정렬
Sort(aData, newPos);

// 큰값들 재정렬
Sort(aData+newPos+1, length-newPos-1);
}