-
거품 정렬@ 16. 1 ~ 17. 1/알고리고리즘 2015. 9. 30. 17:18
현존하는 정렬 알고리즘들 중에서 가장 느리다.
이것은 일종의 잘 될 때까지 "무작정" 시도하는 알고리즘이라고 할 수 있다.
마치 거품이 물 위로 떠오르는 것처럼 정렬이 된다고 해서 거품정렬..
(오른차순으로 정렬을 할 경우)
* 거품 정렬의 최악의 경우
오른차순 정렬인데 내림차순으로 되어 있는 경우..
본질적으로 이중for루프 사용하고 정렬 알고리즘은 n^2에 속한다.
거품 정렬의 최적화
2가지 염두해야할 사항이 있다.
1. 함수가 하나의 반복에서 색인들을 한 번도 바꾸지 않았다면 이미 정렬된것이다.
2. 알고리즘이 ?번 반복되었다면 상위 ?개의 색인들은 이미 정렬된 상태이다.
알고리즘 의사코드
Bubblesort(Array)
int swaps=1
int top=Array.size-1;
int index
while(top!=0 AND swaps!=0)
swaps=0
for(index=0;index<top;index++)
if Array[index] > Array[index+1]
Swap(Array[index], Array[index+1])
swaps++;
end if
end for
top--;
end while
end function
이 함수는 각 반복에서 몇 번의 교환이 일어났는지 계산한다(swaps)
top--; 이것이 아직 정렬되지 않은 가장 큰 색인을 나타낸다. for루프에서 index > top인 이유는 위의 최적화 2와 같다.
#ifndef _SORT_H_
#define _SORT_H_#include"Array.h"
template<class DataType>
void BubbleSort(Array<DataType>& p_array, int(*p_compare)(DataType, DataType))
{
int top = p_array.Size();
int index;
int swaps = 1;while (top != 0 && swaps != 0)
{
swaps = 0;
for (index = 0; index < top; index++)
{
if (p_compare(p_array[index], p_array[index + 1]) > 0)
{
// Swap(p_array[index], p_array[index+1]);
swaps++;
}
}
top--;
}
}#endif
'@ 16. 1 ~ 17. 1 > 알고리고리즘' 카테고리의 다른 글
퀵 정렬 (0) 2015.10.02 힙 정렬 (0) 2015.10.02 등고선 알고리즘 (0) 2013.09.19