이 글은 <자료구조와 알고리즘> 교과시간에 배운
탐색과 정렬 알고리즘에 대해서 정리한 글 입니다.
int seqSearch(int[] a, int n, int key){
// a : 검색 할 배열
// n : 배열의 길이
// key : 검색할 값, 목표
int i = 0; // 배열의 인덱스를 가리키는 변수
while (i < n) {
if(a[i] == key) { //검색 종료 조건 1, 검색에 성공
return i;
}
i++;
}
return -1; //검색 종료 조건 2, 검색 실패
}
int seqSearch(int[] a, int n, int key){
for(int i = 0; i < n; i++){
if(a[i] == key)
return i;
}
return -1;
}
int seqSearchSen(int[] a, int n, int key) {
int i = 0;
a[n] = key; //보초를 추가 한다.
while (true) {
if(a[i] == key){
break;
}
i++;
}
return i == n ? -1 : i;
//만약 i가 n이라면 (= 마지막 요소까지 검색 했다면), 검색 실패
}
int binSearch(int[] a, int n, int key){
int pl = 0; //왼쪽 범위의 초기 값 : 0번
int pr = n - 1; // 오른쪽 범위의 초기 값 : 마지막 번호
do {
int pc = (pl + pr) / 2; // 기준값 : pl과 pr의 가운데
if(a[pc] == key)
return pc; // 검색 성공
else if(a[pc] < key) //찾는 값이 현재 기준보다 오른쪽에 있다면
pl = pc + 1;
else if(key < a[pc]) //찾는 값이 현재 기분값보다 왼쪽에 있다면
pr = pc - 1;
} while (pl <= pr); //범위가 서로 바뀌지 않았을때만 실행
return -1; //검색 실패
}
void bubbleSort(int[] a, int n) {
for(int i = 0; i < n; i++) {
// 패스의 반복
for(int j = n - 1; j > i; j--) { //뒤에서 부터, 앞으로 값을 비교해간다.
if(a[j - 1] > a[j]){ // 바로 앞에 있는 요소가 더 크다면
swap(a, j - 1, j); // 두 수를 교환 해준다.
}
}
}
}
void selectionSort(int[] a, int n) {
for(int i = 0; i < n - 1; i++) {
int min = i; // 최소값을 기록한다.
for(int j = i + 1; j < n; j++) {
if(a[min] > a[j]) //min보다 더 작은 값을 발견했다면
min = j;
}
swap(a, min, i); // 가장 작은 값과 맨 앞의 요소와 교환한다.
}
}
void insertSort(int[] a, int n){
for(int i = 1; i < n; i++){
int temp = a[i]; //현재 선택한 값을 저장
int j;
for(j = i - 1; j >= 0 && a[j - 1] > temp; j--){
// 맨 처음 요소까지 또는 선택한 값
a[j] = a[j - 1]; //앞의 값을 뒤에 대입
}
a[j] = temp; //마지막에 값을 삽입한다.
}
}
void shellSort(int[] a, int n) {
for(int h = 4; h > 0; h /= 2) {
for(int i = h; i < n; i++) {
int temp = a[i];
int j;
for(j = i; j >= 0 && a[j] > temp; j -= h){
a[j + h] = a[j];
}
a[j + h] = temp;
}
}
}
void quickSort(int[] a, int left, int right) {
int pl = left;
int pr = right;
int x = a[(pl + pr) / 2];
// 피벗 값, pl과 pr의 중앙 값
do {
while (a[pl] < x) pl++;
// pl이 가리키는 위치가 피벗보다 작을때 -> pl을 전진
while (x < a[pr]) pr--;
// pr이 가리키는 위치가 피벗보다 클때 -> pr을 전진
if(pl <= pr) swap(a, pl++, pr--);
// pl과 pr이 교차하지 않았다면 -> pr과 pl의 위치를 서로 교환
} while (pl <= pr);
// pl과 pr이 교차하지 않았을때 -> 계속 반복
if(left < pr) quickSort(a, left, pr);
// left와 pr사이에 남은 간격이 있다면 -> 그 부분을 다시 정렬
if(pl < right) quickSort(a, pl, right);
// pl과 right 사이에 남은 간격이 있다면 -> 그 부분을 다시 정렬
}