퀵 정렬(Quick-Sort)
- 퀵 정렬은 평균 수행시간이 O(n log n)으로 매우 효율적인 정렬이다.
- 최악의 경우에는 O(n^2)의 시간까지 걸리기도 한다.
동작원리
- 배열의 가장 끝 원소를 키값으로 삼아 배열의 첫 원소부터 비교해 작은 범위와 큰범위로 나누어 나누어진 범위에 대해 다시 정렬을 하는 원리로 동작한다.
소스
- partition 함수
- /*
- 퀵정렬을 하기위해 내부에서 재배치하는 함수
- 기준값보다 큰값이오면 j 범위에 넣고 작으면 i 범위에 넣어 배치
- */
- int partition(int *arr,int a , int b)
- {
- int x = (*(arr+b));
- int i = a-1;
- int j = 0;
- int temp = 0;
- for(j=a; j<b; j++)
- {
- if( (*(arr+j)) <= x) // j 부분의 값을 검사 기준값 보다 작을시 i 범위에 넣기위해 값을 교체
- {
- i = i+1;
- temp = (*(arr+i));
- (*(arr+i)) = (*(arr+j));
- (*(arr+j)) = temp;
- }
- }
- // 기준값을 j범위의 첫 요소와 교체
- temp = (*(arr+i+1));
- (*(arr+i+1)) = (*(arr+b));
- (*(arr+b)) = temp;
- return i+1; //교체한 기준값을 포함한 i 범위를 반환
- }
- quicksort 함수
- /*
- 퀵 정렬하는 함수
- */
- void quicksort(int *arr,int a, int b)
- {
- int q = 0;
- if(a<b)
- {
- q = partition(arr,a, b);
- quicksort(arr,a, q-1); // 기준값을 뺀 나머지 i 범위를 정렬
- quicksort(arr,q +1, b); // 기준값을 뺀 나머지 j 범위를 정렬
- }
- }
결과
'c언어(알고리즘)' 카테고리의 다른 글
스택(Stacks) - 배열로 구현(The implementation with the array) (0) | 2016.11.01 |
---|---|
힙 정렬 (Heap-Sort) (0) | 2016.11.01 |
삽입정렬(Insertion-Sort) (0) | 2016.11.01 |
선택정렬(Selection-Sort) (0) | 2016.11.01 |
병합 정렬(Merge-Sort) (0) | 2016.10.17 |