2014-10-12 5 views
0

그래서 내 프로그램은 파티션 정렬을 사용하여 10 개의 사용자 입력 이름을 알파벳 순서로 다시 인쇄합니다. IVE는 전에 파티션 정렬을 사용하지 않았습니다. 그래서 이것을 알아내는 데 있어서는 전혀 경험이 없습니다.파티션 및 스왑을 사용하여 알파벳 순서로 정렬

숫자에 파티션 정렬 예제를 사용하고 strcmp를 사용하여 정렬하기 위해 조작하려고합니다.

내가 가지고있는 파티션 기능을 제외하고는 대부분 내 모든 코드가 문제가 있습니다. 누군가이 나를 어떻게 이해할 수 있도록 도와 주실 수 있습니다. 그리고 알파벳순으로 10 개의 이름을 정렬 할 수있는 방법을 알려주십시오.

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

#define DEBUG_LEVEL 0 

int partition(int a[], int left, int right); 
void swap(int *a, int *b); 

#define SIZE 10 

int main(int argc, const char * argv[]) { 

char Names[10][10]; 
int count = 10; 
int i; 
int a[SIZE]; 

printf("Enter 10 names:"); 
for (i=0; i < count; ++i) 
{ 
    gets(Names[i]); 
} 
printf("\n\n"); 
partition(a, 0, SIZE -1); 
printf("The names in alphabetical order are\n"); 
for (i=0; i< count; ++i) 
{ 
    printf("%s\n",Names[i]); 
} 
getchar(); 
} 

int partition(int a[], int left, int right) { 
int i, j, key; 

key = a[left]; 
i = left + 1; 
j = right; 
    while (strcmp(i, j) <0) { 
while (i <= right && a[i] <= key) 
++i; 
while (j >= left && a[j] > key) 
--j; 
if (i < j) 
swap(&a[i], &a[j]); 
    } 
    swap(&a[left], &a[j]); 
    return j; 
} 

void swap(int *a, int *b) { 
    int temp; 
    temp = *a; 
    *a = *b; 
    *b = temp; 
} 
+0

1) 코드가'partition (a, 0, SIZE -1);을 호출하면 'a'의 내용이 초기화되지 않습니다. 2)'i', j'는'int'입니다. – chux

+0

나중에 내가 말한 것처럼이 파티션 세그먼트를 복사 한 다음 단어를 정렬하기 위해 조작 할 수 있기를 바라는 코드에 코드를 추가했습니다. 파티션 정렬 대신 Quicksort를 사용하는 것이 더 쉬운가요? 힌트를 주셔서 감사하지만 메신저는 여전히 어떤 방법으로도 정렬 할 수있는 것처럼 보이지 않습니다. @chux – Zanderg

+0

이것은 정렬 도입에 대한 질문이 아닙니다.)'는 2 문자열의 주소를 취하는 함수입니다 .2 int를 전달하는 것은 의미가 없습니다. 물론 컴파일러가 경고를 제공해야합니다 (경고해야 함). 쉽게 경고를 표시하는 게시 코드는 1) 코드를 컴파일하지 않았 음을 의미합니다. (즉, 주요 no-no입니다) 2) 경고를 사용하지 못하게했습니다 (모두 활성화). 3) 고대 컴파일러와 작업 (새 것을 얻습니다.) 또는 4) 경고를 무시합니다. (그들을 읽고 그것에 따라 행동하십시오). – chux

답변

0

긴 기사에 대한 링크가있는이 분할 정렬 방법에 대한 간단한 설명은 e를 참조하십시오. 지. 위키 백과 : Quicksort.

chux에서 설명한 이유 때문에 표시된 코드는 작동하지 않으며 하위 분할에 대한 재귀 호출이 누락되어 있습니다.

void swap(char a[10], char b[10]) 
{ 
    char temp[10]; 
    strcpy(temp, a); 
    strcpy(a, b); 
    strcpy(b, temp); 
} 

void partition(char Names[][10], int left, int right) 
{ 
    int i, j; 
    char *key; 
    if (right <= left) return; 

    key = Names[left]; 
    i = left+1; 
    j = right; 
    for (; ;) 
    { 
     while (i <= right && strcmp(Names[i], key) <= 0) ++i; 
     while (j >= left && strcmp(Names[j], key) > 0) --j; 
     if (i < j) swap(Names[i], Names[j]); 
     else  { swap( key, Names[j]); break; } 
    } 
    partition(Names, left, j-1); 
    partition(Names, i, right); 
}