[C#] 10일차 - 63. 선형탐색과 이진탐색C#/C#200제2021. 1. 30. 13:32
Table of Contents
선형탐색 :
배열의 처음부터 끝까지 모든 요소를 찾고자하는 값(키값)과 비교하여 같은면 그 값의 인덱스를 결과로 출력합니다.
데이터의 개수가 N일 때 비교횟수는 평균 N/2로 시간복잡도가 O(N)인 알고리즘입니다.
이진탐색 :
배열의 요소들이 정렬되어 있을 때만 적용할 수 있는 알고리즘입니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace A063_BinarySearch
{
class Program
{
static void Main(string[] args)
{
Random r = new Random();
int[] v = new int[30];
for(int i=0; i<30; i++)
v[i] = r.Next(1000);
PrintArray("정렬 전", v);
// (1) 정렬
Array.Sort(v);
PrintArray("정렬 후", v);
Console.Write("=> 검색할 숫자를 입럭하세요: ");
int key = int.Parse(Console.ReadLine());
int count = 0; // 비교횟수
// (2) 선형 탐색
for(int i = 0; i<v.Length -1; i++)
{
count++;
if(v[i] == key)
{
Console.WriteLine("v[{0}] = {1}", i, key);
Console.WriteLine("선형탐색의 비교횟수는 {0}회 입니다.", count);
break;
}
}
// (3) 이진 탐색
count = 0;
int low = 0;
int high = v.Length - 1;
while(low <= high)
{
count++;
int mid = (low + high) / 2;
if(key == v[mid])
{
Console.WriteLine("v[{0}] = {1}", mid, key);
Console.WriteLine("이진탐색의 비교횟수는 {0}회 입니다.", count);
break;
} else if(key > v[mid]) // 만약 v[mid]값이 키값보다 작으면 찾고자 하는 값은 mid위쪽에 있으므로 low를 mid+1로 바꾸고 반복문을 다시 실행
{
low = mid + 1;
} else // 그렇지 않다면 v[mid]값이 키값보다 크다는 뜻이고, 찾고자 하는 값은 mid아래쪽에 있으므로 high를 mid-1로 바꾸고 반복문을 다시 실행
{
high = mid - 1;
}
}
}
private static void PrintArray(string s, int[] v)
{
Console.WriteLine(s);
for(int i = 0; i< v.Length; i++)
{
Console.Write("{0,5}{1}", v[i], (i % 10 == 9) ? "\n" : "");
}
}
}
}
반응형
'C# > C#200제' 카테고리의 다른 글
[C#] 10일차 - 65. 클래스와 구조체 (0) | 2021.01.30 |
---|---|
[C#] 10일차 - 64. 버블정렬 (0) | 2021.01.30 |
[C#] 9일차 - 62. 배열에서 최소, 최대 평균 계산 (0) | 2021.01.29 |
[C#] 9일차 - 61. Random 클래스 (0) | 2021.01.29 |
[C#] 9일차 - 60. 이름을 배열에 저장하고 알파벳 순으로 정렬 (0) | 2021.01.29 |
@반나무 :: 반나무_뿌리
3년차 WPF 개발자입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!