정렬 코드

Oak_Cassia·2022년 1월 20일
0

Data Structure

목록 보기
5/5

심심해서 작성한 코드

#include<iostream>
#include<algorithm>
using namespace std;

class Arr
{
public:
	int* arr;
	int _size;
	Arr(int b)
	{
		arr = new int[b];
		for (int i = 0; i < b; i++)
		{
			*(arr + i) = rand()%100;
		}
		_size = b;
		mergeArr = new int[b];
	}
	~Arr()
	{
		delete arr;
		delete mergeArr;
	}


	void ShowArr()
	{
		for (int i = 0; i < _size; i++)
		{
			cout << arr[i] << " ";
		}
		cout << endl;
	}

	void Insertion()
	{
		for (int i = 1; i < _size; i++)
		{
			int index = i , tmp=arr[index];
			for (int j = i - 1; j >= 0; j--)
			{
				
				
				if (arr[j] > tmp)
				{
					arr[index] = arr[j];
					index--;
				}
				else break;
			}
			arr[index] = tmp;
		}
	}

	void Quick(int start, int end)
	{
		int pivot, L, R, tmp;
		pivot = start;

		if (end - start <= 0) return;

		L = start + 1;
		R = end;

		while (L <= R)
		{
			while (L <= end&&arr[L]<arr[pivot])
				L++;
			while (R>start && arr[R] >= arr[pivot])
				R--;
			if (L < R)
			{
				tmp = arr[L];
				arr[L] = arr[R];
				arr[R] = tmp;
			}
			else
			{
				tmp = arr[R];
				arr[R] = arr[pivot];
				arr[pivot] = tmp;
			}
		}
			

		Quick(start, R -1);
		Quick(R+1,end);
	}

	int* mergeArr;
		
	void MergeSort(int L, int R)
	{
		int M = (L + R) / 2;

		int tmpindex = L;
		int Lindex = L;
		int Rindex = M+1;
		while (Lindex<M+1&&Rindex<=R)
		{
			if (arr[Lindex] > arr[Rindex])
				mergeArr[tmpindex++] = arr[Lindex++];
			else
				mergeArr[tmpindex++] = arr[Rindex++];
		}
		if(Lindex>M)
			while(tmpindex<=R)
				mergeArr[tmpindex++] = arr[Rindex++];
		else
			while (tmpindex <= R)
				mergeArr[tmpindex++] = arr[Lindex++];

		for (; L <= R; L++)
			arr[L] = mergeArr[L];

	}

	void Merge(int L, int R)
	
	{
		int M = (L + R) / 2;
		if (L == R) return;

		Merge(L,M);
		Merge(M+1, R);
				
		MergeSort(L,R);
	}

	
	void Heap()// 객체의 배열을 heap으로 만드는 과정
	{
		//mergeArr 납치
		int size=0;
		while (size<_size)
		{
			mergeArr[size] = arr[size];
			//0 1(3(78)4)2(56)
			if (size == 0)
			{
				size++;
				continue;
			}
			
			for (int Hsize=size; Hsize>0; Hsize= (Hsize - 1) / 2)
			{
				if (mergeArr[Hsize] > mergeArr[(Hsize - 1) / 2])
				{
					int tmp = mergeArr[Hsize];
					mergeArr[Hsize] = mergeArr[(Hsize - 1) / 2];
					mergeArr[(Hsize - 1) / 2] = tmp;
				}
			}
			size++;
		}
		
	}

	void HeapSort()
	{
		Heap();
		for (int i = 0; i < _size; i++)
			arr[i] = mergeArr[i];
	}
	
};


int main()
{
	srand(static_cast<unsigned int>(time(nullptr)));	

	Arr a(10);
	a.Insertion();
	a.ShowArr();

	cout << endl;
	Arr b(6);
	b.Quick(0, 5);
	b.ShowArr();

	cout << endl;
	Arr c(7);
	c.Merge(0, 6);
	c.ShowArr();


	cout << endl;
	Arr d(9);
	d.HeapSort();
	d.ShowArr();
	
}
profile
rust로 뭐할까

0개의 댓글