Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스택의 특징
- 별 찍기 10
- C/C++ 구현
- 백준
- 풀이
- 백준 2447
- 1764
- 자료구조
- qorwns
- 조세퍼스 순열
- dfs
- 해시 구현
- 백준 1158
- 백준 17779
- Stack 이란
- 백준 17822
- 구현
- 버킷 정렬
- 시간 복잡도
- AVL 시간 복잡도
- c#
- 백준 5397
- 백준 17471
- heap
- 백준 1406
- 원판 돌리기
- 게리멘더링2
- 5397
- 해시구현
- ㅣ풀이
Archives
- Today
- Total
홍시홍의 프로그래밍
퀵(quick) 정렬(C/C++ 구현, 시간 복잡도) 본문
1. 퀵 정렬
퀵 정렬(Quicksort)은 찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘이다. 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다.
퀵 정렬은 n개의 데이터를 정렬할 때, 최악의 경우에는 O(n2)번의 비교를 수행하고, 평균적으로 O(n log n)번의 비교를 수행한다.
마땅히 찾아봐도 뭔가 정의?? 같은것은 없다
내 해석 : 피벗을 기준으로 작은 것은 왼쪽 큰것은 오른쪽으로 정렬하며 정렬된 배열을 재귀적으로 정렬하는 알고리즘
출처 : https://ko.wikipedia.org/wiki/%ED%80%B5_%EC%A0%95%EB%A0%AC
요구 사항
1. 배열 오름차순으로 구현
풀이 방법
1. 피벗 선택( 제일 앞 원소)
2. 피벗 보다 작은 것은 왼쪽, 큰것은 오른쪽으로 이동
3. 왼쪽 인덱스를 가르치는 것과 오른쪽 인덱스를 가르치는 포인터가 교차하면 피벗과 오른쪽 포인터를 교환
4. 아닐 경우, 왼쪽 인덱스와 오른쪽 인덱스를 교환
5. 피벗 기준으로 왼쪽과 오른쪽으로 재귀적으로 정렬
6. 시작 위치가 같거나, 엇갈리면 종료
시간 복잡도
평균적
1. 재귀적으로 분할하는 logn
2. 정렬하는데 n
O(nlogn)
최악의 경우(정렬이 되있는 경우)
1. 분할하는데 n(트리 경우로 받을 때, 한쪽으로만 깊이가 깊은 트리)
2. 다시 정렬하는데 n
O(n^2)
1. n까지 counting 하는데 n
2. 숫자 더해주는데 n
3. 다시 정렬하는데 n
O(n)
소스 코드
#include <iostream>
using namespace std;
int arr[10] = { 23,123,324234,12312,2123,24,456,56,123,564 };
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void quick_sort(int list[],int left,int right)
{
if (left >= right)
return;
int pivot = left;
int start = left + 1;
int end = right;
while (start<=end)
{
while (list[pivot] >= list[start] && start <= right)
start++;
while (list[pivot] <= list[end] && end > left)
end--;
if (start > end)
{
swap(list[pivot], list[end]);
}
else
swap(list[start], list[end]);
}
quick_sort(list, left, end - 1);
quick_sort(list, end + 1, right);
}
int main()
{
quick_sort(arr,0,9);
for (int i = 0; i < 10; i++)
cout << arr[i] << " ";
return 0;
}
'알고리즘' 카테고리의 다른 글
버킷(Bucket) 정렬(개념, 시간 복잡도) (0) | 2019.09.23 |
---|---|
기수(radix) 정렬(C/C++ 구현, 시간 복잡도) (0) | 2019.09.23 |
계수(Counting) 정렬(C/C++ 구현, 시간 복잡도) (0) | 2019.09.18 |
병합(합병) 정렬 (C/C++ 구현, 시간 복잡도) (0) | 2019.09.17 |
버블 정렬 (C/C++ 구현, 시간 복잡도) (0) | 2019.09.17 |
Comments