-
std::vector 정렬하기 - quick sort, merge sort소프트웨어 & 잡다 2013. 10. 1. 20:57
std::vector를 정렬하기 위해서는 std::sort를 쓰면 되지만, 요즘 인터뷰관련해서 학부때 공부했던걸 복습하고 있던 참에, 그새 소팅을 까먹은걸 깨닫고 다시 공부해서 작성해 보았습니다.
array가 아니라 vector 버전으로 짰습니다. array버전은 많지만 vector 버전은 별로 없는것 같아 학생분들이나 인터뷰보실분들이 필요할것 같아서 공유합니다. 물론 array나 vector나 마찬가지지이긴 하지만, vector쪽이 코드가 더 간결해집니다.
<퀵 소트>
template <typename T>
void quick_sort_recursive(std::vector<T>& v, size_t left, size_t right) {
size_t i = left, j = right;
T pivot = v[(left+right)/2];
// partition
while(i <= j) {
while(v[i] < pivot)
i++;
while(v[j] > pivot)
j--;
if(i <= j) {
std::swap(v[i++], v[j--]);
}
}
// recursive call
if(left < j)
quick_sort_recursive(v, left, j);
if(i < right)
quick_sort_recursive(v, i, right);
}
template <typename T>
void quicksort(std::vector<T>& array) {
quicksort_recursive(array, 0, array.size()-1);
}
<머지소트>template <typename T>
void merge(std::vector<T>& t, std::vector<T>& a1, std::vector<T>& a2) {
t.clear();
typename std::vector<T>::iterator itr1 = a1.begin();
typename std::vector<T>::iterator itr2 = a2.begin();
while(itr1 != a1.end() || itr2 != a2.end()) {
if(itr1 != a1.end() && itr2 != a2.end()) {
if(*itr1 < *itr2) {
t.push_back(*itr1++);
} else {
t.push_back(*itr2++);
}
} else {
if(itr1 != a1.end()) {
t.push_back(*itr1++);
} else {
t.push_back(*itr2++);
}
}
}
}
template <typename T>
void merge_sort(std::vector<T>& array) {
if(1 < array.size()) {
int f = array.size() / 2;
std::vector<T> array1(array.begin(), array.begin() + f);
merge_sort(array1);
std::vector<T> array2(array.begin()+f, array.end());
merge_sort(array2);
merge(array, array1, array2);
}
}
'소프트웨어 & 잡다' 카테고리의 다른 글
AES 암호화, 그리고 AES-NI, 손에 잡힐듯 말듯한 보물. (3) 2015.03.05 테크니컬 인터뷰 단골손님, 피보나치 수열 계산하기 (0) 2015.02.24 C++에서 데이터를 비트단위로 읽기 (2) 2015.02.09 CentOS 5 에서 GCC4.4 사용하기. (2) 2014.02.18 GCC 4.1 호환 지원 (0) 2013.06.25 SVN trunk 변경사항 되돌리기 (SVN Rollback) (0) 2013.02.27 SVN branch and merge 쉽게 활용하기 #2 (15) 2013.02.13 Redhat/Ubuntu 리눅스에서 램디스크(RAM disk) 만들기 (0) 2012.11.15