Программирование алгоритма быстрой сортировки Q - PullRequest
1 голос
/ 20 декабря 2010

Я пытаюсь написать быструю сортировку и понять алгоритм. Я понимаю 3 основных принципа быстрой сортировки

  • Элемент a [i] находится на последнем месте в массиве для некоторого i.
  • Ни один из элементов в [l], a [i1] не больше, чем [i].
  • Ни один из элементов в [i + 1], ..., a [r] не меньше, чем [i].

Я думаю, что что-то упустил из-за этого алгоритма. Любое руководство высоко ценится.

Мой первый вопрос: l и r, это мин и макс массива? или это любое место в левой и правой части массива.

#include <iostream>

using namespace std;

void quicksort(int a[], int l , int r);
int partition(int a[], int l, int r);
void exchange(int a[], int i, int j);


int main()
{
 const int MAX_ARRAY = 9;
 // Quicksort
 // Array of integers
 int numArray[MAX_ARRAY] = {25,10,25,34,38,7,6,43,56};




 for ( int i = 0 ; i < MAX_ARRAY ; i++) 
 {
  cout << numArray[i] << endl;  
 }


 quicksort(numArray, 4, 7);
 // Call quicksort
 for ( int i = 0 ; i < MAX_ARRAY ; i++) 
 {
  cout << numArray[i]<< endl;  
 }


 system("pause");

 return 0;
}

void quicksort(int a[], int l , int r)
{
 // 
 if (r <= l) {return;} // The max position and least position are now overlapping
 int i = partition(a, l, r); // send the array and the two positions to partition
 // i gives me the next position
 quicksort(a,l,i-1); // sort left side
 quicksort(a,i+1,r); // sort right side
}

int partition(int a[], int l, int r) 
{
 //Declarations
 int i = l-1, j = r; int v = a[r];

 for(;;) // Infinite ForLoop
 {
  // go through till you find a value in the array that is less than v = our pivot
  while(a[++i] < v) ;
  while (v < a[--j]) if (j == 1) break; // THis condition is to go thorugh and check for a number that is larger than v then if j is not at 1 then we break
  if ( i >= j) break; // Overlap array
  exchange(a, i , j); // swap the values

 }
  exchange(a,i,j); // swap the values
  return i;
}

void exchange(int a[], int i, int j ) 
{
 int temp = a[i];
 a[i] = a[j];
 a[j] = temp;
}

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

Мой первый вопрос - l и r, это мин и макс массива? или это любое место в левой и правой части массива.
Нет, это левая и правая границы текущего подмассива, который сортируется. Я понятия не имею, почему вы вызываете метод с параметрами 4 и 7: это означает, что ни один из элементов до 4-го или после 7-го не будет отсортирован.

0 голосов
/ 20 декабря 2010

сначала, quicksort(numArray, 4, 7); должно быть quicksort(numArray, 0, 8);

секунды, чтобы сделать это немного быстрее, вы можете установить номер отсечения, например, 10, при котором вы переключаетесь на сортировку вставки.Сортировка вставки выполняется быстрее, чем быстрая сортировка для небольшого ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...