가장 유명하고, 정렬 알고리즘의 표준이다시피 한 방법입니다. 실제로 코딩을 해 보면, 퀵 정렬이 코드가 가장 긴데, 실행 시간은 퀵 정렬이 다른 알고리즘들보다 기막힐 정도로 짧습니다.
중간값이라는 뭔가 적당한(모호한) 값을 선택해야 하고, 최악의 경우 시간 복잡도가 O(n2)에 메모리 복잡도가 O(n)이 될 가능성까지 있는 알고리즘입니다.
중간값을 기준으로 데이터를 반으로 갈라 놓고, 양측에 대해서 재귀적으로 또 중간값을 설정해 정렬을 또 수행한다는 발상은 대단히 깔끔하고 멋집니다. 이런 걸 분할 정복법이라고 하지요. 이게 '퀵 정렬'이 아니었으면 '이분 검색'을 따라 '이분 정렬'이라는 이름이 붙었을 것입니다.
퀵 정렬은 본디 재귀적으로 정의되지만, 사용자 정의 스택을 구현해서 비재귀적으로 만들 수도 있으며, 본 소스 코드 역시 사용자 스택을 구현했습니다. 또한, 원소 개수가 한 자리 수로 떨어졌을 때는 또 재귀호출을 하는 게 아니라 삽입 정렬을 해서 능률을 극대화하기도 합니다.
- #include <stdio.h>
- void quick_sort(int *arr, int left, int right);
- int main()
- {
- int arr[10] = {28,25,3,14,45,6,27,8,49,1};
- int i = 0;
- quick_sort(arr, 0, 9);
- for(i=0; i<10; i++)
- {
- }
- return 0;
- }
- void quick_sort(int *arr, int left, int right)
- {
- int i, j;
- int temp;
- int pivot = arr[left];
- if(left<right){
- i = left+1;
- j = right;
- while(i<=j)
- {
- while (arr[i] < pivot)
- {
- i++;
- }
- while (arr[j] > pivot)
- {
- j--;
- }
- if(i<j)
- {
- temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }else{
- break;
- }
- }
- temp = arr[j];
- arr[j] = arr[left];
- arr[left] = temp;
- quick_sort(arr, left, j-1);
- quick_sort(arr, j+1, right);
- }
- }
결과 : 1 3 6 8 14 25 27 28 45 49
반응형
'IT > [Everyday]Coding' 카테고리의 다른 글
딥러닝_Neural Network_퍼셉트론 (0) | 2014.12.19 |
---|---|
딥러닝_Neural Network_서론 (0) | 2014.12.19 |
사각형그리기2 (0) | 2014.12.19 |
사각형그리기1 (0) | 2014.12.19 |
파스칼 삼각형 (0) | 2014.12.19 |