ソートの整理


ソートの選択

void selection_sort(int num[], int n){
    int i, j, min, temp;
    for(i = 0; i < n - 1; i++){
        min = i;
        for(j = i + 1; j < n; j++){ // j에 i의 다음 값을 넣음
            if(num[j] < num[min]) // j가 i보다 작으면
                min = j; // min에 j를 넣음
        }
        temp = num[i]; // i와 min의 자리를 교환
        num[i] = num[min];
        num[min] = temp;

        print_array(num, n);
    }
}
  • 選択ソート(選択ソート):2つ以上の未ソート要素のセットで最小値を検索し、ソートリスト
  • に移動します.

    泡の位置合わせ

    void bubble_sort(int num[], int n){
        int i, j, swap, temp;
    
        for(i = 0; i < n - 1; i++){
            swap = 0; // swap 0으로 설정
            for(j = 0; j < n - 1; j++){
                if(num[j] > num[j + 1]){ // j가 j + 1보다 크면
                    temp = num[j]; // 위치 바꾸기
                    num[j] = num[j + 1];
                    num[j + 1] = temp;
                    swap = 1; // swap 1로 설정
                }
            }
            if(swap == 0) break; // swap이 0이 되면 멈추고 출력
            print_array(num, n);
        }
    }
  • バブルソート(バブルソート):項目のキー値を風船にたとえると、数値が大きいほど上昇幅が
  • 大きくなる.

    整列挿入

    void insertion_sort(int num[], int n){
        int i, j, pivot;
        for(i = 1; i < n; i++){ // i는 1부터 시작
            pivot = num[i]; // i의 값을 pivot에 넣음
            for(j = i - 1; j >= 0 && pivot < num[j]; j--)
                // j에는 i - 1의 값을 넣고 j가 0보다 같거나 클 때, i의 값이 j보다 크면
                // j + 1에 j 값을 넣음
                num[j + 1] = num[j];
    
            num[j + 1] = pivot; // 그리고 .j + 1에는 i 값을 넣음
            print_array(num, n);
        }
    }
  • ソートを挿入(ソートを挿入):ソートされたサブリストに新しい要素を追加するプロセス
  • クイックソート

    void quicksort(int num[], int left, int right){
        int pivot, i, j, temp;
        if(left < right){ // right가 더 클 때
            i = left;
            j = right + 1; // j에 right + 1
            pivot = num[left]; // pivot에는 left 값을 넣음
            do{ // i가 j보다 작을 때 반복
                do{ i++; } while(num[i] < pivot); // i가 pivot보다 작을 때 i 증가
                do{ j--; } while(num[j] > pivot); // j가 pivot보다 클 대 j 증가
                if(i < j){ // i가 j보다 작을 때
                    temp = num[i]; // i와 j의 위치 바꿈
                    num[i] = num[j];
                    num[j] = temp;
                    print_array(num, 10);
                }
            } while(i < j);
            // i가 j보다 클 때 위치 바꿈
            temp = num[left]; // left와 j의 위치 바꿈
            num[left] = num[j];
            num[j] = temp;
    
            if(left != j) print_array(num, 10);
            // j를 기준으로 정렬 범위를 조정하여 왼쪽고 ㅏ오른쪽 서브 리스트에 대해 각각 quicksort 함수 호출
            // 재귀적으로 진행
            quicksort(num, left, j - 1);
            quicksort(num, j + 1, right);
        }
    }
  • クイックソート(Quick sort):任意の基数(pivot)xを選択し、ソート対象の数をx値より小さいグループとx値より大きいグループ
  • に分ける.

    お尻の位置合わせ

    void makeheap(int heap[], int root, int n){ // 재정렬할 root, 노드 수
        int child, temp;
        temp = heap[root];
        child = 2 * root; // 왼쪽 자식 노드
    
        while(child <= n){
            if((child < n) && (heap[child] < heap[child + 1])) // 무엇이 더 큰 것인지
                child++;
    
            if(temp > heap[child]) // 부모와 자식 노드 중 큰 것 비교
                break;
            else{ // 자식 노드를 부모 위치로 이동
                heap[child / 2] = heap[child];
                child *= 2; // 한 레벨 낮추기
            }
        }
        heap[child / 2] = temp;
    }
    
    void heapsort(int heap[], int n){ // 원소 개수
        int i, temp;
        for(i = n / 2; i > 0; i--) // 초기 최대 힙
            makeheap(heap, i, n);
    
        printheap(heap, 1, n);
        for(i = n - 1; i > 0; i--){ // n - 1 반복
            temp = heap[1]; // max 값을 마지막 원소와 교환
            heap[1] = heap[i + 1];
            heap[i + 1] = temp;
            makeheap(heap, 1, i); // 재정렬할 노드, 노드의 수
            printheap(heap, 1, n);
        }
    }
  • スタックソート(heap sort):バイナリツリーの最大スタックソート方法
  • を使用

    連結ソート

    void mergesort(int num[], int left, int right){
        int mid;
        if(right > left){ // 오른쪽이 더 크면
            mid = (right + left) / 2; // 둘을 더해 나눈 값 mid에 저장
            mergesort(num, left, mid); // 재귀 호출
            mergesort(num, mid + 1, right); // left를 mid + 1로 대체해 재귀호출
            merge(num, left, mid + 1, right); // merge 함수
            print_array(num, 9);
        }
    }
    
    void merge(int num[], int left, int mid, int right){
        int i, left_end, num_items, tmp_pos;
        int temp[100];
    
        left_end = mid - 1;
        tmp_pos = left;
        num_items = right - left + 1; // right에서 left 빼고 1 더해 item에 넣음
    
        while((left <= left_end) && (mid <= right)){ // mid - 1보다 left가 작을 때 && mid가 right보다 작을 때
            if(num[left] <= num[mid]){ // left가 mid보다 작다면
                temp[tmp_pos] = num[left]; // temp에 left 값 넣음
                tmp_pos = tmp_pos + 1; // pos 값 증가
                left = left + 1; // left 값 증가
            }
            else{
                temp[tmp_pos] = num[mid]; // temp에 mid 값 넣음
                tmp_pos = tmp_pos + 1; // pos 값 증가
                mid = mid + 1; // mid 값 증가
            }
        }
    
        while(left <= left_end){ // left가 left_end 보다 작을 때
            temp[tmp_pos] = num[left]; // 첫번째 세그먼트에 남아있는 항목 추가
            left = left + 1;
            tmp_pos = tmp_pos + 1;
        }
    
        while(mid <= right){ // mid가 right 보다 작을 때
            temp[tmp_pos] = num[mid]; // 두번째 세그먼트에 남아있는 항목 추가
            mid = mid + 1;
            tmp_pos = tmp_pos + 1;
        }
    
        for(i = 0; i < num_items; i++){
            num[right] = temp[right]; // temp 배열을 num 배열에 복사
            right = right - 1;
        }
    }
  • マージソート(マージソート):レコードリストを2つのサブリストに分割し、このプロセスを各サブリストに再帰的に適用し、再分割できないまで
  • を繰り返す.