2013-11-16 2 views
1

Код быстрой сортировки приведен неверно. Может кто-нибудь сказать, что не так?Quicksort с использованием одного контура

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

#define MAX 30 

int b[MAX]; 

void print(int a[],int n) 
{ 
    int i; 
    for(i=0;i<n;i++) 
    { 
     printf("%d\t",a[i]); 
    } 
    printf("\n"); 
} 

int party(int a[],int p,int q) 
{ 
    int pivot=a[p]; 
    int t=a[p]; 

    a[p]=a[q]; 
    a[q]=t; 

    int i,j,k,store=p; 

    for(i=p;i<=q-1;i++) 
    { 
     if(a[i]<=pivot) 
     { 
      t = a[i]; 
      a[i] = a[store]; 
     a[store] = t;store++;} 
    } 

    t = a[store]; 
    a[store] = a[q]; 
    a[q] = a[store]; 

    return store; 
} 

void quicksort(int a[],int p,int q) 
{ 
    if(p>=q) 
    { 
     return; 
    } 

    int r=party(a,p,q); 

    quicksort(a,p,r-1); 
    quicksort(a,r+1,q); 
} 

int main() 
{ 
    printf("Enter No. oF elements for sorting.\n"); 
    int i,j,k,n; 

    scanf("%d",&n); 

    for(i=0;i<n;i++) 
    { 
     printf("Element %d\t",i+1); scanf("%d",&b[i]); 
    } 

    print(b,n); 

    quicksort(b,0,n-1); 

    print(b,n); 
    return 0; 
} 

EDIT: Просто провел несколько минут, и сделал некоторые основные отступа вместо того, чтобы просить автора, чтобы сделать это. Я мог бы поставить правильные имена переменных, но так как ответ ответил, что все в порядке.

+0

Попробуйте отступ и формат для вопроса. Также попробуйте использовать отладчик –

+0

. С какой ошибкой вы собрали этот код? – Sarge

+0

Ошибка при компиляции, она запускается и дает неправильный вывод. –

ответ

2

Похоронен в тот ужасный код форматирования, кажется, нравится это:

t=a[store];a[store]=a[q];a[q]=a[store]; 

для здравомыслящих людей выглядит следующим образом:

t=a[store]; 
a[store]=a[q]; 
a[q]=a[store]; 

Вы установки a[q] к тому же значению, что только был и ничего не менял. Должно быть:

t=a[store]; 
a[store]=a[q]; 
a[q]=t; 

Btw, вам не нужны и низкие и высокие показатели, вам нужен всего лишь базовый адрес массива и длина этого алгоритма (и немного указателя математики, конечно) :

static void swap_int(int *a, int *b) 
{ 
    int t = *a; 
    *a = *b; 
    *b = t; 
} 

void quicksort(int a[], int len) 
{ 
    int i=0, pvt=0; 

    if (len <=1) 
     return; 

    for (;i<len;++i) 
    { 
     if (a[i] < a[len-1]) 
      swap_int(a+i,a+pvt++); 
    } 
    swap_int(a+pvt,a+len-1); 
    quicksort(a, pvt++); 
    quicksort(a+pvt, len-pvt); 
} 

Там я идти, он даже имеет разделение, построенный в Поворотное должна быть случайной выбран, но тот на другой день, я полагаю..

+0

Да, это была ошибка, ничего о здравомыслии. Но прохладно на новичках. Большое спасибо. –

+1

@RafedNole Не беспокойтесь. Попробуйте использовать только один параметр длины. вы будете удивлены, как легко это происходит вместе. – WhozCraig

+0

Не могли бы вы рассказать немного больше, пожалуйста. Один параметр длины, т. Е. Каждый раз передает длину подмассива/начального индекса функции партии? Или Функция быстрой сортировки? –

1

Это была очень глупая ошибка.

В обмен на [STORE] и [Q] в функции партии:

т = а [магазин]; а [магазин] = а [Q]; а [д] = а [магазин]; -----> Это неправильно.

a [q] = t должно быть последним утверждением.

Теперь он отлично работает. Спасибо за супер быстрый ответ в любом случае.

Смежные вопросы