2012-09-29 7 views
-3

같은 문제를 해결하려고 노력 중입니다 ...배열에서 모든 홀수 요소를 시작으로 이동해야하며 ... 심지어 마지막 요소까지 ... 이 방법을 시도했지만 여기에 질서를 잃는 ... 누군가가 나를 도울 수 있습니까 ??????? I는 얻을 출력 ... 장소 용액의 선형 시간 기대 1 3 5 7 9 4 8 2 6
...첫 번째 승점과 마지막 승점

#include<stdio.h> 
void swap(int *p,int *q) 
{ 
*p=*p^*q; 
    *q=*p^*q; 
    *p=*p^*q; 
} 
    int main() 
    { 
    int arr[]={ 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9}; 
    int odd=0; 
    int even=0; 
    int arr_size = sizeof(arr)/sizeof(arr[0]); 
    while(even< arr_size){ 
    if(arr[even]&1) 
     swap(&arr[odd++],&arr[even++]); 
    else 
     even++; 
    } 
int i=0; 
for(i=0;i<arr_size ;i++) 
printf("%d ",arr[i]); 
return 0; 
} 
+0

예상 출력은 1,3,5,7,9,2,4,6,8,9 –

+0

입니다. 원하는대로 끝나기를 원하십니까? 이상하고 에반스가 정렬되기를 원하십니까? –

+0

도 끝까지 ... 원하는대로 정렬 할 필요가 없습니다 ... –

답변

2

방법이 솔루션

#include<stdio.h> 


    int main() 
    { 
    int i; 
    int arr[]={ 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9}; 
    int arr_size = sizeof(arr)/sizeof(arr[0]); 
    int sorted[arr_size]; 
    int sp = 0; 
    for(i=0;i<arr_size;i++){ 
    if(arr[i]&1){ 
     sorted[sp++]=arr[i]; 
    } 
    } 

    for(i=0;i<arr_size;i++){ 
    if(!(arr[i]&1)){ 
     sorted[sp++]=arr[i]; 
    } 
    } 

    for(i=0;i< arr_size ;i++) 
    printf("%d ", sorted[i]); 
return 0; 
} 
에 대한

출력은

1 3 5 7 9 2 4 6 8 

가 ** 업데이트 **

이 (가) 위의 더 많은 공간을 사용하는 반면입니다 목록을 두 번 실행하면 목록은 한 번만 실행되지만 더 많은 공간을 사용합니다.

int main(){ 

    int i; 
    int arr[]={ 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9}; 
    int arr_size = sizeof(arr)/sizeof(arr[0]); 
    int sorted[arr_size]; 
    int even = 1+arr_size/2; 
    int odd = 0; 

    for(i=0;i<arr_size;i++){ 
    if(arr[i]&1) 
     sorted[odd++]=arr[i]; 
    else 
     sorted[even++]=arr[i]; 
    } 

    for(i=0;i< arr_size ;i++) 
    printf("%d ", sorted[i]); 

return 0; 
} 
+0

그것은 두 번 걸립니다 .... 여분의 공간 ... 내가 찾고있는 솔루션이 아닙니다 ... –

+2

@SreeRam 원하는 장소에 있다면 싱글 패스 솔루션을 사용해야합니다. – verdesmarald

+0

@verdesmarald sry ... 내 요구 사항에 대한 설명을 더 분명하게 했어야합니다 ... 주석에 대한 tnks ... –

-1

swaping 이것을 위해 단순히 두 만들 수보다 compalsary하지 않으면 for 루프는 evens를 추가하고 다른 하나는 확률을 나타냅니다. 다음과 같이 표시됩니다. -

j=0; 
    for(i=2;i<a_size;i+2) 
    { 
    b[j++]=a[i]; 
    } 
    for(i=1;i<a_size;i+2) 
    { 
    b[j++]=a[i]; 
    } 

마지막으로 a.

당신은 특별한 비교 기능을 qsort에 전화를 사용할 수 있습니다
1

: (HussainAl - 무타으로의 수행은) 당신이 사용할 수없는 보조 배열을 사용하지 않는 솔루션을

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

int cmp(const void * a, const void * b) { 
    int aa = *((int*)a); 
    int bb = *((int*)b); 
    // If aa is odd and bb is even aa is smaller 
    if(aa%2 == 1 && bb%2 == 0) 
     return -1; 
    // If bb is odd and aa is even bb is smaller 
    if(aa%2 == 0 && bb%2 == 1) 
     return 1; 
    // If both even or odd respect current position. (If a is before b in arr a has lower address) 
    if(a<b) 
     return -1; 
    return 1; 
} 
int main(void) { 
    int arr[] = { 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9};  
    int len = sizeof(arr)/sizeof(arr[0]); 
    int i; 
    qsort(arr, len, sizeof(int), cmp); 
    for(i=0; i<len; i++) 
     printf("%d ", arr[i]); 
    return 0; 
} 

종류의 insertion sort 인플레 이스 솔루션을 가지고 있지만 그 런타임은 2 차로 증가 HussainAl-Mutawa의 버전은 런타임이 선호하는 경우 최적 인 것 같습니다 :). 그냥 완전성 여기 내 구현을 위해 :

int main(void) { 
    int arr[]={ 2, 1 ,4 ,3 ,6 ,5 ,8 ,7 ,9}; 
    int len = sizeof(arr)/sizeof(arr[0]); 
    int i,j; 
    for(i=1; i<len; i++) { 
     int cur=arr[i]; 
     if(cur%2 == 0) 
      continue; 
     j=i; 
     while(j>0 && arr[j-1]%2 == 0) { 
      arr[j]=arr[j-1]; 
      j--; 
     } 
     arr[j]=cur; 
    } 

    for(i=0; i<len; i++) 
     printf("%d ", arr[i]); 

    return 0; 
} 
+1

불행히도 이것은 작동하지 않습니다. 'qsort'는 안정된 정렬이 아니며 마지막에 포인터 비교를 추가하는 것으로 충분하지 않습니다. 자세한 내용은 [이 질문] (http://stackoverflow.com/questions/584683/stabilizing-the-standard-library-qsort)을 참조하십시오. – verdesmarald

+0

@verdesmarald는 어떻게 작동하는지 설명 할 수 있습니다 ... –

+0

@SreeRam 작동하지 않기 때문에 작동 방식을 설명 할 수 없습니다!;) 제가 링크 한 질문은 왜 그렇지 않은지에 대한 좋은 설명이 있습니다. 당신이 이해하지 못한 부분은 무엇입니까? – verdesmarald

관련 문제