블로그 이미지

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
  • total
  • today
  • yesterday
2011. 12. 21. 12:46 JAVA언어

갑자기 왠 퀵 정렬이냐 라곤 하지만,

그나마 정렬에선 퀵 정렬이 빠르고 그만큼 저도 자주 애용하는 정렬 기법입니다.

정리해 두었다가 필요할 때 잽싸게 훑어볼 목적으로 글을 남깁니다. 크크크.

먼저 정렬을 할 배열 중에서 어느 기준의 값을 하나 정합니다. 우리는 그것을 pivot(중심축)이라고 하죠.

그리고 배열의 왼쪽으로부터 검색하여(iLow) 배열의 값이 pivot보다 크거나 같은 값의 인덱스를 찾습니다.

역시 그 배열의 오른쪽으로부터 검색하여(iHigh) 배열의 값이 pivot보다 작은 값의 인덱스를 찾습니다.

-임의로 결정한 pivot은 5. 왼쪽 인덱싱의 값은 1, 오른쪽 인덱싱의 값은 8-

둘이 가리키는 데이터를 교체합니다.

이어서 같은 방식으로 계속 검색해 나갑니다.

- 0와 9를 교체-

그러다가 iLow와 iHigh가 엇갈리는 순간이 되면, pivot의 값과 iHigh의 값을 교체해 줍니다.

-pivot값 5와 iHigh의 4의 값과 교체-

여기까지 정렬의 1단계가 끝. 이제부터 분할 정복이 시작됩니다.

분할 정복에 대해 간단히 설명하자면,

배열의 범위를 마지막 iHigh의 인덱스를 기준으로 쪼개서 나눠진 둘의 범위에 대해 위의 과정을 반복하는 것이지요.

-1단계 마지막 iHigh 값을 기준으로 두 범위로 나눠서 각각 1단계를 적용-

 

-2단계 후. 이 예에서는 각각의 분할 축의 위치가 한쪽에 치우쳐 있어서 더 이상 분할되지가 않는다-

-3단계 후-

-4단계 후. 정렬 완료-

아래는 소스입니다. 주석이 있으니 이해하기엔 충분할 겁니다. (파일 첨부)

// pArray : 데이터가 들어있는 배열
// iLow_ : 정렬할 범위의 최하 인덱스
// iHigh_ : 정렬할 범위의 최상 인덱스


template< typename T >
void quick_sort( T* pArray, int iLow_, int iHigh_ ) {

//인덱스 점검
if( iLow_ >= iHigh_ ) {
return ;
}

int iLow, iHigh; //인덱스
int pivot; //비교할 기준 값

iLow = iLow_;
iHigh = iHigh_ + 1;
pivot = pArray[ iLow_ ]; //기준 데이터는 최하 인덱스의 데이터로

do {

//교체할 데이터 위치를 찾는다.

do {
}while( pArray[ ++iLow ] < pivot );

//교체할 데이터 위치를 찾는다.

do {
}while( pArray[ --iHigh ] > pivot );

//기준보다 큰 데이터와 적은 데이터를 서로 교환
if( iLow < iHigh ) {

// pArray[ iLow ] ^= pArray[ iHigh ] ^= pArray[ iLow ] ^= pArray[ iHigh ]; //Swap! only integer, short available

T temp = pArray[ iLow ];

pArray[ iLow ] = pArray[ iHigh ];

pArray[ iHigh ] = temp;
}else {
break;
}

}while( TRUE );

//정렬 후, pivot과 iHigh 교체

pArray[ iLow_ ] = pArray[ iHigh ];
pArray[ iHigh ] = pivot;

//분할 정복
quick_sort( pArray, iLow_, iHigh - 1 );
quick_sort( pArray, iHigh + 1, iHigh_ );

}//void quick_sort


[출처]
Quick Sort ( 퀵 정렬 )|작성자 Hermet

Change JAVA


public List<Integer> sort(List<Integer> target) {
  List<Integer> returnValue = new ArrayList<Integer>(target);
  
  quickSort(returnValue,0,returnValue.size()-1);

  return returnValue;
 }

private void quickSort(List<Integer> target, int iLow_, int iHigh_) {
  
  if (iLow_ >= iHigh_) {
   return;
  }

  int iLow, iHigh;
  int pivot;

  iLow = iLow_;
  iHigh = iHigh_ + 1;
  pivot = target.get(iLow_);

  do {


   do {
   } while (target.get(++iLow) < pivot);


   do {
   } while (target.get(--iHigh) > pivot);

   if (iLow < iHigh) {


    int temp = target.get(iLow);

    target.set(iLow,target.get(iHigh));

    target.set(iHigh,temp);
   } else {
    break;
   }

  } while (true);

  target.set(iLow_,target.get(iHigh));
  target.set(iHigh,pivot);

  quickSort(target, iLow_, iHigh - 1);
  quickSort(target, iHigh + 1, iHigh_);
 }

'JAVA언어' 카테고리의 다른 글

java 7의 기능 모음  (1) 2012.03.07
간단한 Enum 사용법  (0) 2011.12.21
MySQL JDBC INSERT 시 AUTO INCREMENT 값을 알아내는 예제  (0) 2011.10.05
String 컴파일  (0) 2011.08.05
싱글톤 생성법(늦은 생성)  (0) 2011.04.27
posted by 천상의날개