C++ 개념 공부/알고리즘

[C++] 탐색 - 순차 탐색(Sequential Search)

taene_ 2024. 4. 3. 20:54

- 순차 탐색 sequential search이란 순서대로 찾아간다는 의미이다.

배열은 메모리가 1차원 직선으로 나열된 형태라 선형(linear)이라는 용어를 사용하는 경우가 많은데,

배열을 순차적으로 탐색하는 것은 메모리를 한 칸 한 칸 선형으로 찾는 것이므로 선형 탐색이라고도 부른다.

#include <iostream>
using namespace std;

void Print(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		cout << arr[i] << ' ';
	}
	cout << '\n';
}

int Count(int* arr, int size, int k)
{
	int count = 0;
	for (int i = 0; i < size; i++)
	{
		if (k == arr[i])
			count++;
	}

	return count;
}

int SequentialSearch(int* arr, int size, int k)
{
	int index = -1;
	for (int i = 0; i < size; i++)
	{
		if (k == arr[i])
		{
			index = i;
			return index;
		}
	}

	/*
	int i;
	for (i = 0; i < size && k != arr[i]; i++);

	if (i == size)
		return -1;
	else
		return i;
		*/

	return index;
}

void InsertionSort(int* arr, int size)
{
	for (int i = 0; i < size - 1; i++)
	{
		if (arr[i] > arr[i + 1])
		{
			int insertNum = arr[i + 1];
			int insertIndex = -1;
			for (int j = i; j >= 0 && insertNum < arr[j]; j--)
			{
				arr[j + 1] = arr[j];
				insertIndex = j;
			}
			arr[insertIndex] = insertNum;
		}
	}
}

int SortedCountHelper(int* arr, int size, int k, int start)
{
	int sortCount = 0;
	for (int i = start; k == arr[i]; i++)
	{
		sortCount++;
	}
	return sortCount;
}

int SortedCount(int* arr, int size, int k)
{
	int i = SequentialSearch(arr, size, k);

	if (i < 0)
		return 0;
	else
		return SortedCountHelper(arr, size, k, i + 1) + 1;
	// sequentialSearch로 어차피 숫자를 찾았으니까 +1 해두고
	// 효율적으로 (i + 1)번째부터 숫자를 찾게 한다.
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int arr[] = { 8,1,1,3,2,5,1,2,1,1 };
	int n = sizeof(arr) / sizeof(arr[0]);

	cout << "Count 9 = " << Count(arr, n, 9) << '\n';
	cout << "Count 2 = " << Count(arr, n, 2) << '\n';
	cout << "Count 8 = " << Count(arr, n, 8) << '\n';
	cout << "Count 1 = " << Count(arr, n, 1) << '\n';
	cout << '\n';

	cout << "Search 2 = " << SequentialSearch(arr, n, 2) << '\n';
	cout << "Search 5 = " << SequentialSearch(arr, n, 5) << '\n';
	cout << "Search 9 = " << SequentialSearch(arr, n, 9) << '\n';
	cout << '\n';

	InsertionSort(arr, n);

	Print(arr, n);

	cout << "Sorted Count 9 = " << SortedCount(arr, n, 9) << '\n';
	cout << "Sorted Count 2 = " << SortedCount(arr, n, 2) << '\n';
	cout << "Sorted Count 8 = " << SortedCount(arr, n, 8) << '\n';
	cout << "Sorted Count 1 = " << SortedCount(arr, n, 1) << '\n';

	return 0;
}