2013-08-07 3 views
0

Я пытался реализовать quicksort. Но контроль, похоже, никогда не выходит из функции quicksort. Любая помощь приветствуется.Ошибка реализации Quicksort

Несколько указателей:

  1. Я использую первый элемент в качестве опоры. Я знаю, что существуют намного лучшие и эффективные методы выбора стержня, но это не об этом.

2. Переменная 'k' в функции разбиения является элементом поворота.

Насколько я знаю, проблема связана с функцией перегородки, так как я пробовал отлаживать ее разное время.

Кроме того, это не вопрос Домашней работы. Я пытался реализовать алгоритм, узнав его сам.

#include<iostream> 
using namespace std; 

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

void readarray(int a[],int n) 
{ 
    cout<<"Enter elements for the array\n"; 
    for(int i=0;i<n;i++) 
     cin>>a[i]; 
} 

void printarray(int a[],int n) 
{ 
    cout<<"Elements are as follows\n"; 
    for(int i=0;i<n;i++) 
     cout<<a[i]<<" "; 

    cout<<endl; 
} 


int partition(int low,int high,int a[]) 
{ 
    int i,j,k; 
    i=low; 
    j=high; 
    k=low; 

    while(i<=j) 
    { 
     while(a[i]<a[k]) 
      i++; 

     while(a[j]>=a[k]) 
      j--; 


     if(i<=j) 
     { 
      swap(a[i],a[j]); 
      i++; 
      j--; 
     } 
    } 

    if(i>j) 
     swap(a[k],a[j]); 

    return j; 
} 

void quicksort(int low,int high,int a[]) 
{ 
    int k; 
    if(low<high) 
    { 
     k=partition(low,high,a); 
     quicksort(low,k-1,a); 
     quicksort(k+1,high,a); 
    } 
} 

int main() 
{ 
    int a[20]; 
    int n; 
    cout<<"Enter the size of the array\n"; 
    cin>>n; 
    readarray(a,n); 
    cout<<"Before sorting\n"; 
    printarray(a,n); 

    quicksort(0,n,a); 

    cout<<"After sorting contents are\n"; 

    printarray(a,n); 

    return 0; 
} 

В основной функции я попытался как с помощью быстрой сортировки (0, п, а) и быстрой сортировки (0, п-1, а). Ничего не сработало.

+0

предпочитают использовать ссылки вместо указателей в функции подкачки – Manu343726

+5

Это не должен 't компилируется, потому что вы передаете значения 'int', такие как' a [i] ', в функцию swap вместо ожидаемых значений указателя, таких как' a + i'. –

+1

@ Другие причины использовать ссылки :) – Manu343726

ответ

2

Существует проблема с вашей обычной раздела, см комментарии:

int partition(int low, int high,int a[]) { 
    int i, j, k; 
    i = low; 
    j = high; 
    k = low; 

    while (i < j) 
{ 
    while(a[i] <= a[k]) // Move i while item < kth element 
    i++; 
    while(a[j] > a[k]) // Move j while item > kth element 
    j--; 
    if (i < j) 
    swap(&a[i],&a[j]); //Pass address of elements 
} 

swap(&a[low],&a[j]); // j is final position for the kth element (viz.the pivot) 

    return j; 
} 

Вызов быстрой сортировки рутина с помощью:

quicksort(0,n-1,a);

+0

Хорошая работа, чтобы остановить его, выходя за пределы массива ... Я получаю -858993460 1 2 для массива 2, 1, 3 с этим, хотя – doctorlove

+0

@doctorlove спасибо, он работает для меня: http: //ideone.com/bddEpN – P0W

+0

Спасибо. Это сработало для меня. Не могли бы вы рассказать мне, как использование ссылок заставило его работать и почему отсутствие ссылок вызвало ошибку в первую очередь? Также, когда мы передаем элементы массива в качестве аргументов, это не адрес, отправленный сам по себе. Почему нам нужно отправить его через ссылку явно? – Piyush

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

  • Нет связанных вопросов^_^