2013-09-05 6 views
0
void qkSort (int *arr,int size) 
{ 
    if (size>1) 
    { 
     int p = partition(arr,size); 
    qkSort(arr,p); 
    qkSort(arr+p+1,size-(p-1)); 
    } 
    return; 
} 

int partition(int *arr,int size) 
{ 
    int i,j,pivot,temp; 
    pivot = size-1; 
    for(i=0,j=-1;i<size-1;++i) 
    { 
     if (arr[i]<arr[pivot]) 
     { 
      ++j; 
      if(i!=j) 
      { 
       temp = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = temp; 
      } 
     } 
    } 

    temp = arr[pivot]; 
    arr[pivot] = arr[j+1]; 
    arr[j+1] = temp; 

    pivot = j+1; 

    return pivot; 
} 

Программа зависает. Мониторинг переменных с помощью gdb показывает, что второй рекурсивный вызов не передаёт его аргумент правильно. Пожалуйста помоги! Заранее спасибо!реализация quicksort в c

+1

У вас есть объявление для 'partition', видимое из' qkSort', где вы его называете? Если нет, ваш компилятор должен был предупредить вас; сверните свои уровни предупреждения. В этом конкретном случае это не должно вызывать каких-либо видимых проблем, но вы всегда должны иметь * видимый прототип для любой функции, которую вы вызываете. –

+0

@Keith Thompson Я использовал несколько файлов. Объявления присутствуют в отдельном заголовке. – user2751812

ответ

0

Ваш расчет размера 2-го массива неправильный.

qkSort(arr+p+1,size-(p-1)); 

Это будет работать.

qkSort(arr+p+1,(size-p)-1); 
2

Пожалуйста, обратитесь к: http://p2p.wrox.com/visual-c/66347-quick-sort-c-code.html

Этот пример должен помочь вам начать работу.

+0

Код, на который вы ссылаетесь, нуждается в 3 аргументах, указателе на массив и первом и последнем индексе. Однако не существует способа работать с двумя аргументами, указателем и размером массива? – user2751812

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