1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <iostream>
#include <ctime>
using namespace std;
 
void swap(int& a, int& b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}
 
class Sort{
    int NumOfElements;
    int* elements;
    void makeNum(int Num){
        cout<<"생성된 데이터 :";
        for(int i = 0; i<Num; i++){
            *(elements+i)=rand()%100;
            cout<<*(elements+i)<< ' ';
        }
        cout<<endl;
    }
public:
    Sort(int NumOfElements){
        this->NumOfElements = NumOfElements;
        elements = new int[NumOfElements];
        makeNum(NumOfElements);
    }
    Sort(){
        cout<<"자료의 개수를 입력해주세요:";
        cin>>NumOfElements;
        elements = new int[NumOfElements];
        makeNum(NumOfElements);
    }
    void display(){
        for(int i = 0; i<NumOfElements; i++){
            cout<<*(elements+i)<< ' ';
        }
        cout<<endl;
    }
    ~Sort(){
        if(elements != NULL) delete[] elements;
        elements = NULL;
    }
    void smallest_select(){
        int smallest = elements[0];
        int i;
 
        for(i = 1; i<NumOfElements; i++){
            if( elements[i] < smallest ) smallest = elements[i];
        }
 
        cout<<"가장 작은 값은"<<smallest<<"입니다"<<endl;
    }
 
    void large_select(){
        if(elements == NULL){
            cout<<"자료가 없습니다"
            return;
        }
 
        int largest=0;
        int temp = 0;
        int i,j;
        for(i = NumOfElements-1; i>=0; i--){  //자료형이 0번 방부터 시작함을 유의
            largest=i;
            for(j = i-1 ; j>=0; j--){
                if(elements[j] > elements[largest]) largest=j;
            }
            if(i != largest ){
                swap(elements[i], elements[largest]);
                cout<<i<<"번째 자료 "<<elements[i]<<"와 "<<largest<<"번째 데이터"<<elements[largest]<<" Exchange"<<endl;
                display();
            }
        }
    }
 
    void quick_sort(){
        _quick_sort(0, NumOfElements-1);
 
    }
 
    void _quick_sort(int _left, int _right){
 
        if( _left >= _right ) return;
 
 
        int pivot = elements[_left];
        //cout<<"Pivot"<<pivot<<endl;
        display();
        int left_index = _left, right_index=_right+1;
        
        do{
            do{
                left_index++;
                cout<<"left_index:"<<left_index<<"  left_index 값:"<<elements[left_index]<<endl;
            }while( (elements[left_index] < pivot)&&(left_index <= _right));
 
            do{
                right_index--;
                cout<<"right_index:"<<right_index<<"  right_index 값:"<<elements[right_index]<<endl;
            }while( (elements[right_index] > pivot)&&(right_index >= _left+1) );
            
            if(left_index<right_index){
                cout<<"피벗보다 큰"<<elements[left_index]<<"값과 피벗보다 작은"<<elements[right_index]<<"값을 교환"<<endl;
                swap(elements[left_index],elements[right_index]); 
            }
            //교차점근처서 바꾸고 나서, 다시 값이 바뀔수 있다
            //위의 left_index++와 right_index--를 거쳐야 교차를 한다.
            //그런데 이 검사를 밑 while에서 하므로 if문으로 확인해줘야한다.
            
        }while(left_index<right_index);
    
        cout<<"[Pivot]:"<<elements[_left]<<"와"<<elements[right_index]<<"를 교환"<<endl;
        swap(elements[_left],elements[right_index]); //피벗과 교환
        display();
 
        if(_left<right_index-1){
        cout<<"재귀함수 호출... 인덱스"<<_left<<"에서 인덱스"<<right_index-1<<"까지 재귀함수 호출"<<endl;
        _quick_sort(_left, right_index-1);
        }
 
        if(right_index+1<_right){
        cout<<"재귀함수 호출... 인덱스"<<right_index+1<<"에서 인덱스"<<_right<<"까지 재귀함수 호출"<<endl;
        _quick_sort(right_index+1, _right);
        }
    }//void _quick_sort
};
void main(){
    srand(time(0));
    
    Sort* s = new Sort;
    
    //s->large_select();
    s->quick_sort();
 
    cout<<"====================최종 결과:======================="<<endl;
    s->display();
    delete s;1
 
}


설정

트랙백

댓글