Categories: 미분류/기타

5가지의 정렬 알고리즘을 선택하여 배열을 정렬하는 프로그램 with C++

정렬 알고리즘(sorting algorithms) 대표적인 5가지를 활용하여 visual studio console에서 사용자로부터 배열의 크기와 요소들을 입력받고, 5가지 정렬 방법 중 1가지를 선택하게 하여, 정렬한뒤 결과값을 출력하는 프로그램이다. 기본적으로 무한반복이고 -1을 입력하면 프로그램이 종료한다.

사용한 정렬 방법은 순서대로 선택정렬(selection sort), 버블정렬(bubble sort), 삽입정렬(insertion sort), 머지정렬(merge sort), 퀵정렬(quick sort)이다.

// This program is about 5 sorting algorithms. In main function, we select 5 ways to solve and loop.
#include <iostream>
using namespace std;

void swap(int* a, int* b)
{
 int temp = *a;
 *a = *b;
 *b = temp;
}
void printArr(int arr[], int size)
{
 for (int i = 0; i < size; i++)
 {
  cout << arr[i] << " ";
 }
 cout << "\n";
}
void selectionSort(int arr[], int size)
{
 for (int i = 0; i < size - 1; i++)
 {
  int min = i;
  for (int j = i + 1; j < size; j++)
  {
   if (arr[min] > arr[j])
   {
    min = j;
   }
  }
  swap(arr[i], arr[min]);
 }
}
void bubbleSort(int arr[], int size)
{
 for (int i = 0; i < size - 1; i++)
 {
  bool swapped = false;
  for (int j = 0; j < size - 1 - i; j++)
  {
   if (arr[j] > arr[j + 1])
   {
    swap(arr[j], arr[j + 1]);
    swapped = true;
   }
  }
  if (!swapped)
   break;
 }
}
void insertionSort(int arr[], int size)
{
 for (int i = 1; i < size; i++)
 {
  int key = arr[i];
  int j = i - 1;
  while (j >= 0 && arr[j] > key)
  {
   arr[j + 1] = arr[j];
   j--;
  }
  arr[j + 1] = key;
 }
}
void merge(int arr[], int left, int mid, int right)
{
 int numOfLeftArr = mid - left + 1;
 int numOfRightArr = right - mid;
 auto* leftArr = new int[numOfLeftArr];
 auto* rightArr = new int[numOfRightArr];
 for (int i = 0; i < numOfLeftArr; i++)
 {
  leftArr[i] = arr[left + i];
 }
 for (int i = 0; i < numOfRightArr; i++)
 {
  rightArr[i] = arr[mid + 1 + i];
 }

 int indexOfLeftArr = 0;
 int indexOfRightArr = 0;
 int indexOfMergedArr = left;
 while (indexOfLeftArr < numOfLeftArr && indexOfRightArr < numOfRightArr)
 {
  if (leftArr[indexOfLeftArr] < rightArr[indexOfRightArr])
   arr[indexOfMergedArr++] = leftArr[indexOfLeftArr++];
  else
   arr[indexOfMergedArr++] = rightArr[indexOfRightArr++];
 }
 while (indexOfLeftArr < numOfLeftArr)
  arr[indexOfMergedArr++] = leftArr[indexOfLeftArr++];
 while (indexOfRightArr < numOfRightArr)
  arr[indexOfMergedArr++] = rightArr[indexOfRightArr++];
 delete[] leftArr;
 delete[] rightArr;
}
void mergeSort(int arr[], int begin, int end)
{
 if (begin >= end)
  return;
 int mid = begin + (end - begin) / 2;
 mergeSort(arr, begin, mid);
 mergeSort(arr, mid + 1, end);
 merge(arr, begin, mid, end);
}
int partition(int arr[], int low, int high)
{
 int pivot = high;
 int pi = low - 1;
 for (int i = low; i < pivot; i++)
 {
  if (arr[i] < arr[pivot])
   swap(arr[++pi], arr[i]);
 }
 swap(arr[++pi], arr[pivot]);
 return pi;
}
void quickSort(int arr[], int low, int high)
{
 if (low >= high)
  return;
 int pivot = partition(arr, low, high);
 quickSort(arr, low, pivot - 1);
 quickSort(arr, pivot + 1, high);
}

int main()
{
 while (true)
 {
  cout << "Input array size(exit to -1)>>";
  int arrSize{};
  cin >> arrSize;
  if (arrSize == -1)
  {
   cout << "Program exit" << endl;
   break;
  }
  auto* arr = new int[arrSize];
  for (int i = 0; i < arrSize; i++)
  {
   cout << "arr[" << i << "]>>";
   cin >> arr[i];
  }

  while (true)
  {
   cout << "Current Array is >>";
   printArr(arr, arrSize);
   cout << "\n";

   cout << "We sort this arry in ascending order. Input sorting menu\n1. Selection Sort\n2. Bubble Sort\n";
   cout << "3. Insertion Sort\n4. Merge Sort\n5. Quick Sort\n>>";
   int menuNum{};
   cin >> menuNum;
   bool isWrongInput = false;
   switch (menuNum)
   {
   case 1:
    selectionSort(arr, arrSize);
    printArr(arr, arrSize);
    break;
   case 2:
    bubbleSort(arr, arrSize);
    printArr(arr, arrSize);
    break;
   case 3:
    insertionSort(arr, arrSize);
    printArr(arr, arrSize);
    break;
   case 4:
    mergeSort(arr, 0, arrSize - 1);
    printArr(arr, arrSize);
    break;
   case 5:
    quickSort(arr, 0, arrSize - 1);
    printArr(arr, arrSize);
    break;
   default:
    cout << "Wrong input. Try again" << endl;
    isWrongInput = true;
    break;
   }
   if (!isWrongInput)
    break;
  }
 }
}

출력 화면이다.

Microsoft Visual C++ 컴파일러 사용해서 2024년 5월에 정상 작동하였다.
reference : geeksforgeeks

haroharorin

Share
Published by
haroharorin

Recent Posts

홀로라이브 안의사람 얼굴, 빨간약 모음 (실물, 나이, 국적)

버츄얼 유튜버 그룹 홀로라이브 소속 멤버들의 실제 얼굴, 빨간약, 전생 정보 포스팅을 모아봤다. 실물, 나이,…

8 months ago

우사다 페코라 빨간약, 전생 사진, 안의 사람 얼굴

우사다 페코라 토끼 홀로라이브 3기생 우사다 페코라(兎田ぺこら)의 빨간약, 전생 사진, 실물(실제 얼굴), 나이 등의 안사람 정보를 모아봤다. …

8 months ago

요조라 멜 빨간약, 전생 사진, 안의 사람 얼굴

요조라 멜(요조라 메루) 홀로라이브 1기생 요조라 멜(夜空メル)의 빨간약, 전생 사진, 실물(실제 얼굴), 나이 등의 안사람 정보를…

8 months ago

아키 로젠탈 빨간약, 전생 사진, 안의 사람 얼굴

아키 로젠탈(아키로제) 홀로라이브 1기생 아키 로젠탈(アキロゼ)의 전생 사진, 실물(실제 얼굴), 나이 등의 안사람 정보를 모아봤다. (빨간약) 아키로제는…

8 months ago

아카이 하아토 빨간약, 전생 사진, 안의 사람 얼굴

아카이 하아토(하쨔마) 홀로라이브 1기생 아카이 하아토(赤井はあと)의 전생 사진, 실물(실제 얼굴), 나이 등의 안사람 정보를 모아봤다. (빨간약) 아카이…

8 months ago

아멜리아 왓슨 빨간약, 전생 사진, 안의 사람 얼굴

아멜리아 왓슨(Watson Amelia) 홀로라이브 EN 1기생 아멜리아 왓슨(Watson Amelia)의 전생 사진, 실물(실제 얼굴), 나이 등의 안사람 정보를…

8 months ago