반응형

오늘은 정렬에 대해 알아볼 것인ww

사실 정렬에는 무수히 많은 알고리즘이 있따.

아래가 정렬의 종류라네요.... 난 몰랑...

  • 선택정렬
  • 삽입정렬
  • 버블정렬
  • 병합정렬
  • 정렬
  • 정렬
  • 트리정렬

사실 다 알필욘 없고 오늘은 버블정렬에 대해 글을 써보겠스빈당

 

버블정렬이란?

버블정렬.gif

버블정렬은 움짤만 봐도 알 수 있듯이, 인접한 두 원소를 비교해가며 조건에 따라 swap(교환이라는 뜻ㅎ)하는 정렬알고리즘입니당....

이 움짤에서 사실 디테일이 들어가있는데, 눈치채신 분들도 있겠지만 더 이상 정렬할 필요가 없을 때 정렬을 멈추는 것입니다 ㄷㄷ... 이게 진짜 중요합니다 굿

오늘의 수업에서 짠 저의 버블정렬 알고리즘을 공개하겠습니다....... 두둥

// 버블정렬
struct MySort
{
    static void BubbleSort(std::vector<int>& numbers)
    {
        bool isSwap;
        for (int i = 0; i < numbers.size(); i++) {
            std::cout << "cycle start\n";
            isSwap = false;
            for (int j = 0; j < numbers.size() - 1 - i; j++)
            {
                if (numbers[j] > numbers[j + 1])
                {
                    std::swap(numbers[j], numbers[j + 1]);
                    isSwap = true;
                    std::cout << "sort!\n";
                }
            }
            if (!isSwap) return;
        }
    }
};

돌을 던지지 마시오

기본적인 오름차순 버블정렬 알고리즘을 짜봤읍니다...

 

numbers[j] > numbers[j + 1]를 비교해서 참이면 swap을 해줬고, isSwap을 참으로 바꿔줬읍니다.

isSwap은 매 사이클마다 false로 바꿔주는데, swap한적이 없으면 정렬이 다 되어있는 상태이므로, 정렬을 종료하도록 코드를 짜줬읍니다.

 

 

반응형

반응형

하이염

한국인을 위한 코드 미리보기부터 가겠습니다.

 

#include <iostream>

class Complex
{
private:
	int real;
	int image;
public:
	Complex(int r = 0, int i = 0) : real(r), image(i) {}
	~Complex() = default;

	Complex operator+(const Complex& _val)
	{
		return Complex(real + _val.real, image + _val.image);
	}
	Complex operator-(const Complex& _val)
	{
		return Complex(real - _val.real, image - _val.image);
	}
	Complex operator++()
	{
		return Complex(++real, ++image);
	}
	Complex operator++(int)
	{
		return Complex (real++, image++);
	}
	friend std::ostream& operator<< (std::ostream& _os, const Complex& _class);
};

std::ostream& operator<< (std::ostream& _os, const Complex& _class)
{
	_os << _class.real << " + " << _class.image << "i" << '\n';
	return _os; // 뒤로 연계할 수 있도록 cout을 계속 연결해준다.
}


int main()
{
	Complex x(10, 20), y(20,40);
	Complex z;

	std::cout << x;
	std::cout << y;

	std::cout << x++;
	std::cout << ++x;

	z = x + y;
	std::cout << z;

	z = y - x;
	std::cout << z;
}

 

ㅁㅊ 클래스끼리 더하기 뺴기를 할 수 있다니 ㅋㅋ ㄷㄷ

 

operator 연산자라는건 쉽게말하면 연산자의 역할을 직접 정해줄 수 있게 해주는 고마운 애다.

 

반응형
반응형

중첩클래스는 말그대로 class의 class의 class의 class의 class다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ (ㅈㅅ.. 근데 진짜임 ㅁㅊㅋㅋ)

이해를 돕기위한 사진을 보고 가시겠습니다...

아 미친 개웃기다

 

ㅈㅅ 이해를 돕기위한건 핑계고 그냥 이름 듣자마자 이거 생각나서 넣어봄.

사실 이번 주제는 하나도 어려운게 아니라 그냥 이런게 있다 하는 개념이라 뭐 별거없다.

그래서 이번 코드는 게임엔진 구조도 익힐 겸 실제로 사용하는 요소들을 넣어서 짜봤다.(Scene, Object, ObjectManager) ㅈㄴ 힘들었으니 개추부탁드립니다....

코드부터 바로 보고 시작하자.

#include <iostream>

class ObjectManager;

class Object
{
private:
	char* m_name;
public:

	Object(const char* _name)
	{
		m_name = new char[strlen(_name) + 1];
		strcpy_s(m_name, strlen(_name) + 1, _name);
	}

	~Object()
	{
		delete[] m_name;
	}

	char* GetName() 
	{
		return m_name;
	}
};



class Scene
{
private:
	// Scene에서만 쓸거면 Scene내부에 class를 만들어 준다. (근데 원래는 이러면 안댐 사실)
	class ObjectManager
	{
	private:

		Object* m_objectList[10]; // 걍 정적으로 선언헀지만 실제론 가변길이 컨테이너를 사용해야 한다능
		int size = 0;

	public:

		ObjectManager() = default;
		~ObjectManager() = default;

		Object* CreateObject(const char* _name)
		{
			Object* obj = new Object(_name);
			m_objectList[size++] = obj;
			return obj;
		}

		Object* GetObject(int _val)
		{
			return m_objectList[_val];
		}

		int GetObjectCount()
		{
			return size;
		}

	};

	ObjectManager* m_objectManager;

public:

	Scene()
	{
		m_objectManager = new ObjectManager();
	}
	~Scene()
	{
		delete m_objectManager;
	}

	ObjectManager* GetObjectManager() { return m_objectManager; }
	void Show()
	{
		std::cout << "Total ObjectCount : " << m_objectManager->GetObjectCount() << '\n';
		for (int i = 0; i < m_objectManager->GetObjectCount(); i++)
		{
			std::cout << i << "st Object : " << m_objectManager->GetObject(i)->GetName() << '\n';
		}
	}
};


int main()
{
	Scene myScene;
	myScene.GetObjectManager()->CreateObject("코딩이 즐겁다1");
	myScene.GetObjectManager()->CreateObject("코딩이 즐겁다2");
	myScene.GetObjectManager()->CreateObject("코딩이 즐겁다3");

	myScene.Show();

}

 

사실 그냥 클래스 안에 클래스나 struct를 짤 수 있다는 것만 알면 된다. 걍 심심해서 짜봄...

 


너무 대충 쓴 것 같아서 추가

 

list나 vector, stack 등과 같은 컨테이너의 iterator도 중첩클래스의 일부라고 보면 좋다.

STL - iterator — 개발자의 글쓰기 (tistory.com)

 

STL - iterator

컨테이너마다 내부 구조가 다른데, 이 컨테이너들을 하나의 연산으로 묶어서 순회할 수 있게 하는 것이 반복자다. 반복자의 종류 임의 접근 반복자, 양방향 반복자, 순방향 반복자, 입력 반복자,

blackmanta.tistory.com

이분거도 보면 class안에 struct, 혹은 class가 들어간다.

위 사진에서 예를 들면 NODE와 MyListIterator객체는 MyList의 내부에서 밖에 쓸 일이 없으므로 MyList안에 class를 구현한 것이다.

반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++] DFS 구현해보기  (0) 2024.07.10
[C++] operator 연산자  (0) 2024.06.14
[C++] friend에 대해 알아보자.araboza  (0) 2024.06.12
[C++] const, 근데 class를 곁들인  (0) 2024.06.11
[C++] static, 근데 class를 곁들인  (0) 2024.06.11

+ Recent posts