저장되어 있는 자료 중 원하는 항목을 찾는 작업
종류
public class Array2 {
public static void main(String[] args) {
int[] arr = {4, 9, 11, 23, 2, 19, 7};
int key = 2;
int result = searchForNoSort(arr, key);
int result2 = searchForNoSort(arr, key);
System.out.println(result);
System.out.println(result2);
}
static int searchForNoSort(int[] arr, int key){
for(int i = 0; i<arr.length; i++) {
// 값을 찾은 경우
if(arr[i]==key) return i;
}
// 값을 찾지 못한 경우
return -1;
}
static int searchWhileNoSort(int[] arr, int key){
int cnt = 0;
while(cnt < arr.length) {
if (arr[cnt] == key) return cnt;
cnt++;
}
return -1;
}
}
public class Array3 {
public static void main(String[] args) {
int[] arr = {4, 9, 11, 23, 2, 19, 7};
int key = 2;
Arrays.sort(arr);
int result3 = searchForSort(arr, key);
int result4 = searchWhileSort(arr, key);
System.out.println(result3);
System.out.println(result4);
}
static int searchForSort(int[] arr, int key) {
// 반복문이 반복을 실행하는 문장이 2개이므로 양이 많아졌다고 할 수 있지만,
// 중간에 종료를 확인하게 되는 경우, 반복문의 진행이 적어질 수 있다.
for(int i = 0; i<arr.length; i++) {
if(arr[i] == key) return i;
else if (arr[i] > key) return -1;
}
return -1;
}
static int searchWhileSort(int[] arr, int key) {
int cnt = 0;
while (arr[cnt] >= key) {
if (arr[cnt] == key) return cnt;
}
return -1;
}
구현
binarySearch(int[] a, int key) left ← 0; right ← length(a) - 1; while ( left 〓 right) { mid = (left+right)/2; if(a[mid] == key) return true; // 검색 성공 else if (a[mid] > key) right = mid - 1; // 왼쪽으로 이동 else left = mid + 1; // 오른쪽으로 이동 } return false // 검색 실패
public class 이진검색 {
public static void main(String[] args) {
int[] nums = {2, 4, 7, 9, 11, 19, 23};
int result = binarySearch(nums, 10);
System.out.println(result);
}
static int binarySearch(int[] arr, int key) {
// 인덱스 검색이므로 0 과 length-1 을 해줘야 한다.
int left = 0;
int right = arr.length - 1;
// 구간 안에 데이터가 1개 존재한다는 것은 그 값이 맞을 수도 있으므로
// left가 커져서 역전되는 값만 아니면 모두 탐색해야 한다.
while(left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == key) {
return mid;
}
else if (arr[mid] < key) {
// 중간 값이 검색 값보다 작은 경우
// 오른쪽만 확인하면 되는 것이므로, 왼쪽 값을 중앙으로 옮기면 그 후에 오른쪽 확인이 가능하다.
left = mid + 1;
} else {
// 중간 값이 검색 값보다 큰 경우
right = mid - 1;
}
}
return -1;
}
}
binarySearch(int[] a, int left, int right, int key){
if (left > right) return false;
mid = (left + right) / 2;
if(key == a[mid]) return true;
else if (key < a[mid]) return binarySearch(a, left, mid -1, key);
else if (key > a[mid]) return binarySearch(a, mid + 1, right, key);
}
public class 선택정렬 {
public static void main(String[] args) {
int[] nums = {10, 64, 25, 11, 28, 77, 34};
SelectionSort(nums);
System.out.println(Arrays.toString(nums));
}
static void SelectionSort(int[] arr) {
// cycle 횟수는 배열 길이 - 1이 된다.
for(int i = 0; i<arr.length; i++) {
// 최솟값의 인덱스를 저장할 변수
int minIdx = i;
for(int j = i+1; j<arr.length; j++) {
if(arr[minIdx] > arr[j]) minIdx = j;
}
// 배열 i의 값과, minIdx의 값을 변경해주면 된다.
int temp = arr[i];
arr[i] = arr[minIdx];
arr[minIdx] = temp;
}
}
}
Counting_sort(int[] A, int[] B, k)
//A[] - 입력 배열
//B[] - 정렬된 배열
//C[] - 카운트 배열
//k - 최대값
//n - 입력 배열 길이
C = new int[k];
for i from 0 to n
C[A[i]] += 1 // 값의 인덱스에 갯수 추가하기
for i from 1 to k
C[i] += C[i-1] // 누적합 배열로 만들 것
for i from n-1 to 0
B[C[A[i]] -1] = A[i]
C[A[i]]--
O(n+k)
n은 배열의 길이, k는 정수의 최대값 (둘 중 큰 값으로 결정)