Stable
크기가 같은 데이터가 정렬 후에도 입력 순서 유지
stable : 5 5 —(정렬 이후)— 5 5
not-stable : 5 5 —(정렬 이후)— 5 5
In-place
입력 데이터를 저장하는 메모리 외에는 상수 크기의 메모리만 필요
입력 데이터 크기 : n
정렬 과정에서 데이터가 정렬된 데이터(왼쪽)와 정렬되지 않은 데이터(오른쪽)로 나뉘어짐
특징
로직
https://hyo-ue4study.tistory.com/68
정렬하시오
void selectionSort(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
int minIdx = i;
// 정렬되지 않은 데이터들(i+1 ~ n)
for (int j = i + 1; j < n; j++)
{
if (arr[j] < arr[minIdx])
minIdx = j;
}
// 자기 자신이 최소일 경우 swap 하지 않음 : 없어도 노상관
if (minIdx != i)
swap(arr[i], arr[minIdx]);
}
}
정렬 시, swap한 횟수와 비교한 횟수를 구하시오
int swapCount, compareCount;
void selectionSort(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
int minIdx = i;
// 정렬되지 않은 데이터들(i+1 ~ n)
for (int j = i + 1; j < n; j++)
{
compareCount++;
if (arr[j] < arr[minIdx])
minIdx = j;
}
if (minIdx != i)
{
swap(arr[i], arr[minIdx]);
swapCount++;
}
}
}
struct Count
{
int swap = 0;
int compare = 0;
}; // struct(구조체) 작성 시, ; 쓰는 거 잊지 말기 !
Count selectionSort(int *arr, int n)
{
Count count;
for (int i = 0; i < n; i++)
{
int minIdx = i;
// 정렬되지 않은 데이터들(i+1 ~ n)
for (int j = i + 1; j < n; j++)
{
count.compare++;
if (arr[j] < arr[minIdx])
minIdx = j;
}
if (minIdx != i)
{
swap(arr[i], arr[minIdx]);
count.swap++;
}
}
return count;
}
int main()
/*
출력을 위한 코드 */
Count counts;
counts = selectionSort(numbers, n);
/*
출력을 위한 코드 */
}
인접한 두 수의 크기 비교하여 swap하며 정렬(오름차순, 내림차순)
void bubbleSort(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 1; j < n - i; j++)
{
if (arr[j] < arr[j - 1])
swap(arr[j], arr[j - 1]);
}
}
}
void impoveBubbleSort(int *arr, int n)
{
for (int pass = 0; pass < n; pass++)
{
bool swapped = false;
for (int j = 1; j < n - pass; j++)
{
if (arr[j] < arr[j - 1])
{
swap(arr[j], arr[j - 1]);
swapped = true;
}
}
if(!swapped)
break;
}
}