C#으로 짠 정렬 알고리즘 (선택,삽입,버블,퀵) (sort)

2015. 3. 24. 16:44IT/HTML

** C#으로 짠 알고리즘정렬입니다.

** 밑에 있는것은 선택정렬 삽입정렬 버블정렬 퀵 정렬 모두 한코드에서 돌아가는 프로그램입니다.

 

////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Text;

namespace sort
{
    
    public class run
    {
        private string str;
        private int[] arr = new int[9] { 3, 5, 8, 2, 1, 6, 4, 9, 7 };

        public run()
        {
            while (str != "q")
            {
                menushow();
                
                str = Console.ReadLine();
                
                switch (str)
                { 
                    case "1":
                        selectionsort(arr);
                        break;
                    case "2":
                        insertsort(arr);
                        break;
                    case "3":                        
                        bubblesort(arr);
                        break;
                    case "4":
                        printarr();
                        Console.WriteLine("퀵  정렬 과정 ");
                        quicksort(arr,0,arr.Length-1);             
                        break;
                    case "5":                        
                        minival(arr);
                        break;
                    case "6":                        
                        maxval(arr);
                        break;
                    case "q":
                        Console.WriteLine("종료");
                        break;
                    default :
                        Console.WriteLine("다시 입력하세요");
                        break;
                }

            }
        }
        private void menushow()
        {
            Console.WriteLine("===============");
            Console.WriteLine("1 . 선택정렬");
            Console.WriteLine("2 . 삽입정렬");
            Console.WriteLine("3 . 버블정렬");
            Console.WriteLine("4 . 퀵  정렬");
            Console.WriteLine("5 . 최 소 값");
            Console.WriteLine("6 . 최 대 값");
            Console.WriteLine("q . 종    료");       
            Console.WriteLine("===============");
            Console.Write("메뉴 선택 : ");
        }

        private void selectionsort(int[] arr) // int[9] { 3, 5, 8, 2, 1, 6, 4, 9, 7 }에 배열을 인자로받음
        {
            int[] s_arr = arr; // s_arr을 arr로 초기화
            printarr(); // 초기 배열값 보여주는 함수 호출 
            Console.WriteLine("선택 정렬 과정    "); 
            for (int i = 0; i < s_arr.Length - 1; i++) // 배열길이 만큼 포 루프문 수행
            {             
                for (int j = i+1; j < s_arr.Length; j++) // j초기값을 i+1 로 둬서 포루프 문 수행
                                                        
                {
                    if (s_arr[j] < s_arr[i]) // 만약 인덱스[i] 와 인덱스 [i+1] 과 비교해서 
                                            //뒤에값이 작으면 값교환
                    {
                        swap(s_arr, j, i);
                    }
                 
                }
                printarr(s_arr); //선택 정렬 과정 출력 
            }         
        }

        private void insertsort(int[] arr) // int[9] { 3, 5, 8, 2, 1, 6, 4, 9, 7 }에 배열을 인자로받음
        {
            int[] i_arr = arr; // i_arr을 arr로 초기화
            printarr(); // 초기 배열값 보여주는 함수 호출 
            Console.WriteLine("삽입 정렬 과정    ");
            for (int i = 1; i < i_arr.Length; i++) // 배열길이 만큼 포 루프문 수행
            {

                for (int j = i; j > 0; j--) // j초기값을 i 로 둬서 감소 포루프 문 수행
                {                  
                    if (i_arr[j - 1] > i_arr[j]) // i_arr[j-1] 이 i_arr[j] 보다 클때 
                                                 // j-1 과 j 인덱스 값에 위치를 교환
                    {                     
                        swap(i_arr, j - 1, j);
                    }
                    else
                    {
                        break; // 만약 j-1 이 j 값보다 작을때 break.
                    }
                    printarr(i_arr);
                }
                 //삽입 정렬 과정 출력 
            }
        }
        private void bubblesort(int[] arr) // int[9] { 3, 5, 8, 2, 1, 6, 4, 9, 7 }에 배열을 인자로받음
        {
            int[] b_arr = arr; // b_arr을 arr로 초기화
            printarr();  // 초기 배열값 보여주는 함수 호출 
            Console.WriteLine("버블 정렬 과정    ");
            for (int i = 0; i < b_arr.Length; i++) // 배열길이 만큼 포 루프문 수행
            {
                for (int j = 1; j < b_arr.Length - i; j++) //초기값 1로 해서 (배열길이 - i) 만큼 
                {
                    if (b_arr[j-1] > b_arr[j]) // 초기값 1로 (배열길이-1) 만큼 j-1과 j 인덱스값 비교
                                                // 후 j-1이 크면 값 교환                                                 
                    {                      
                        swap(b_arr, j - 1, j);
                    }
                    
                }
                printarr(b_arr); //버블 정렬 과정 출력 
            }   
        }
        private void quicksort(int[] arr, int left, int right)
        // int[9] { 3, 5, 8, 2, 1, 6, 4, 9, 7 }에 배열과 , 왼쪽커서 , 오른쪽커서 을 인자로 받음
        // 왼쪽커서 초기값은 0 , 오른쪽커서 초기값은 (배열길이-1)
        {
            int[] q_arr = arr; // q_arr을 arr로 초기화
            
            int lastlow; //lastlaw 왼쪽커서 변수선언
           
            if (left >= right ) // 왼쪽 커서 와 오른쪽커서와 교차하면 리턴
                return;

            lastlow = left;

            for (int i = left + 1; i <= right; i++) //왼쪽커서가 오른쪽커서와 같거나 클때 까지 포문 수행
            {                
                if (q_arr[i] < q_arr[left]) //피봇 값과 왼쪽커서를 비교해서 피봇값보다 작으면 피봇과 swap                             
                {
                    swap(q_arr, ++lastlow, i);
                }
            }
            swap(q_arr,lastlow,left); // 재귀 함수 호출 피봇을 중앙으로 위치 
            quicksort(q_arr, left, lastlow - 1); // 피봇을 중앙으로 왼쪽에 값들을 정렬
            quicksort(q_arr, lastlow + 1, right); // 피봇을 중앙으로 오른쪽 값들을 정렬
            printarr(q_arr); //퀵 정렬 과정 출력 
            
        }

        private void minival(int[] arr) // int[9] { 3, 5, 8, 2, 1, 6, 4, 9, 7 }에 배열을 인자로받음
        {
            int[] m_arr = arr; // m_arr을 arr로 초기화
            printarr(); // 초기 배열값 보여주는 함수 호출
              
            int min = m_arr[0]; //첫번째 배열 값 min 초기화
            for (int i = 1; i < m_arr.Length; i++) //배열길이만큼 포문 수행
            {
                if (m_arr[i] < min) 
                  {
                      min = m_arr[i]; // 배열길이 만큼 min 을 비교해서 가장 작은 값을 비교해서 
                                      // min값에 초기화
                  } 
            }       
            Console.WriteLine("배열 최소값 : " + min);       
        }
        private void maxval(int[] arr) // int[9] { 3, 5, 8, 2, 1, 6, 4, 9, 7 }에 배열을 인자로받음
        {

            int[] n_arr = arr; // n_arr을 arr로 초기화
            printarr(); // 초기 배열값 보여주는 함수 호출
            int max = n_arr[0]; //첫번째 배열 값 max 초기화

            for (int i = 1; i < n_arr.Length; i++) 
            {
                if (n_arr[i] > max)
                  {
                      max = n_arr[i]; // 배열길이 만큼 max 을 비교해서 가장 큰 값을 비교해서 
                                      // max값에 초기화
                  }                   
            }
            Console.WriteLine("배열 최대값 : " + max);       
        }

        private void printarr() // 배열 최초값 출력함수
        {            
            arr[0] = 3;
            arr[1] = 5;
            arr[2] = 8;
            arr[3] = 2;
            arr[4] = 1;
            arr[5] = 6;
            arr[6] = 4;
            arr[7] = 9;
            arr[8] = 7;
            Console.Write("초기 배열 : { ");
            for (int i = 0; i < arr.Length; i++) 
            {
                Console.Write("{0} ",arr[i]);
            }
            Console.Write("}");
            Console.WriteLine();
        }

        private void printarr(int[] arr)// 정렬 결과 출력함수
        {
            int [] complete_arr = arr;
            Console.Write("{ ");
            for (int i = 0; i < complete_arr.Length; i++) 
            {
                
                Console.Write("{0} ", complete_arr[i]);
            }
            Console.Write("}");
            Console.WriteLine();
        }
        private void swap(int[] arr, int i, int j) //swapping 함수
        {
            int temp;
            
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }

}
    class main
    {
        static void Main(string[] args)
        {
            run r = new run(); //run 객체 생성
        }
    }
}



'IT > HTML' 카테고리의 다른 글

동영상 Yutube 제목 및 상태바 노출 여부, showinfo, controls  (0) 2015.03.24
새창 팝업창 소스  (0) 2015.03.24
폼쓰기  (0) 2015.03.24