Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

C++ 버블 정렬로 문자열을 영숫자 순서로 정렬하기

주어진 문자열 목록을 영숫자(alphanumeric) 순서, 즉 사전(Dictionary) 순서로 정렬하는 방법을 소개합니다. 예를 들어 Apple, Book, Aim이라는 세 단어가 있을 때, 정렬 결과는 Aim → Apple → Book 순이 됩니다. 목록에 숫자가 섞여 있는 경우에는 숫자로 시작하는 문자열이 알파벳 문자열보다 앞쪽에 배치됩니다.

입력 및 출력

입력:
문자열 목록: Ball Apple Data Area 517 April Man 506

출력:
정렬 후 문자열: 506 517 Apple April Area Ball Data Man

알고리즘

sortStr(strArr, n)

입력: 전체 문자열 목록과 요소 개수 n

출력: 영숫자 순서로 정렬된 문자열 배열

Begin
    for round := 1 to n-1, do
        for i := 0 to n-round, do
            res := compare str[i] and str[i+1]   // 양수, 음수 또는 0
            if res > 0, then
                swap str[i] and str[i+1]
        done
    done
End

이 알고리즘은 버블 정렬(Bubble Sort) 방식을 기반으로 합니다. 인접한 두 문자열을 비교했을 때 앞쪽 문자열이 뒤쪽 문자열보다 사전 순서상 뒤에 온다면(비교 결과가 양수라면) 두 문자열의 자리를 서로 바꿉니다. 한 번의 순회가 끝나면 가장 큰 값이 맨 뒤로 이동하며, 이 과정을 n-1회 반복하면 전체 목록이 정렬됩니다.

C++ 구현 예제

#include<iostream>
#define N 8
using namespace std;

void display(int n, string str[]) {
    for(int i = 0; i<n; i++)
        cout << str[i] << " ";       // 배열의 문자열을 출력
    cout << endl;
}

void sortStr(int n, string str[]) {
    int i, round, res;
    for(round = 1; round<n; round++)
        for(i = 0; i<n-round; i++) {
            res = str[i].compare(str[i+1]);
            if(res > 0)
                swap(str[i], str[i+1]);  // 문자열 위치 교환
        }
}

main() {
    string str[N] = {"Ball", "Apple", "Data", "Area", "517", "April", "Man", "506"};
    cout << "Strings before sort:" << endl;
    display(N, str);
    sortStr(N, str);
    cout << "Strings after sort:" << endl;
    display(N, str);
}

실행 결과

Strings before sort:
Ball Apple Data Area 517 April Man 506
Strings after sort:
506 517 Apple April Area Ball Data Man

동작 원리

str[i].compare(str[i+1]) 함수는 두 문자열을 사전 순서로 비교하여 다음 세 가지 값 중 하나를 반환합니다.

  • 0: 두 문자열이 동일한 경우
  • 음수: str[i]가 str[i+1]보다 사전 순서상 앞에 오는 경우
  • 양수: str[i]가 str[i+1]보다 사전 순서상 뒤에 오는 경우

숫자로 시작하는 문자열("506", "517")이 알파벳 문자열보다 먼저 오는 이유는, ASCII 코드에서 숫자 문자('0'~'9', 48~57)가 대문자('A'~'Z', 65~90)보다 작은 값을 가지기 때문입니다. 따라서 별도의 처리 없이 기본적인 문자열 비교만으로도 숫자 → 알파벳 순서의 영숫자 정렬이 자연스럽게 이루어집니다.