순차정렬과 선택정렬은 둘다 간단하게 구현할 수 있지만 차이가 있습니다.
순차 정렬은 맨 앞에서부터 제일 작은 원소를 배치하게 만들어 나가는 알고리즘입니다.
이를 위해 배치할 자리에 있는 원소를 뒤쪽에 있는 원소들과 비교하면서 작은 것을 발견하면 배치할 위치의 원소와 교환합니다.
여기서 중요한 점은 가장 작은 수와 바꾸었어도 계속 확인하며 끝까지 간다는 점입니다.
순차 정렬(base:배열의 시작 주소, n: 원소 개수, compare:비교 논리)
int[] arr = new int[n]{n,n,n,n,n, …………};
for (int i = 0; i <= n; i++){
for (int j = i+1; j <= n; j++){
int temp;
if(arr[i] > arr[j]){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
선택정렬은 맨 앞에서부터 제일 작은 원소를 배치하게 만들어 나가는 알고리즘입니다.
배열의 길이를 구하고, 반복문을 이용하여 배열의 요소를 순차적으로 탐색합니다.
현재 위치에서부터 배열의 끝까지 중에서 최소값을 찾아서, 최소값의 인덱스를 minIndex 변수에 저장합니다.
최소값의 인덱스와 현재 위치를 가리키는 변수 i의 값이 다르다면, 두 값을 교환합니다.
위 과정을 반복하여, 전체 배열을 정렬합니다.
int[] arr = new int[n]{n,n,n,n,n, …………};
int n = arr.length;
for (int i = 0; i < n-1; i++) {
int minIndex = i;
for (int j = i+1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
순차정렬은 2중 반복문중 안쪽 반복문에서 교환이 계속일어나는 반면에 선택정렬은 작은 숫자만 넣어둔뒤 빠져나와서 한번만 교환을 하는 형식으로 이루어지므로 순차는 교환횟수가 많을수 있으나 선택정렬은 최대 n-1만큼의 교환이 이루어 집니다.
순차정렬은 같은 값의 요소들이 상대적인 순서를 유지하지 않을 수 있으며, 따라서 안정적인 정렬 알고리즘이 아닙니다. 반면 선택정렬은 같은 값의 요소들도 상대적인 순서를 유지하기 때문에 안정적인 정렬 알고리즘입니다.
하지만 둘다 다른 알고리즘에 비해 효율적이지 않아서 대부분의 상황에서는 다른 정렬 알고리즘이 선호됩니다.