Для начала, если массив имеет N элементов, тогда допустимый диапазон индексов равен [0, N-1]
Таким образом, есть попытка получить доступ к памяти вне массива
int pivot = size;
int i = - 1;
for(int j = 0 ; j < size - 1 ; j++){
if(array[j] < array[pivot])
^^^^^^^
Ваша функция подкачки не имеет смысла.
void swap(int *i, int* j){
*i = *j;
*j = *i;
*i = *j;
}
После первого выражения выражения
*i = *j;
оба объекта, на которые указывают указатели i
и j
, будут иметь одинаковое значение.
Функция может быть определена следующим образом.
void swap( int *p, int *q )
{
int tmp = *p;
*p = *q;
*q = tmp;
}
и называется как
swap( &array[i], &array[j] );
Функциональный раздел также недействителен. Помимо некорректно используемого алгоритма, по крайней мере, его первый параметр объявлен также неправильно.
вместо
void partition( int* array[], int size );
функция должна быть объявлена как
void partition( int *array, int size );
или более правильно, как
void partition( int *array, size_t size );
и функция должна вызываться как
int array[] = {7,2,1,8,6,3,5,4};
size_t size = sizeof(array)/sizeof(array[0]);
partition( array,size );
С другой стороны, функция partition
должна возвращать позицию, которая делит массив на две части. Таким образом, окончательное объявление функции будет выглядеть как
size_t partition( int array[], size_t size );
Ниже приведена демонстрационная программа, показывающая, как можно быстро написать рекурсивную функцию быстрой сортировки с использованием функций swap
и partition
.
#include <stdio.h>
void swap( int *p, int *q )
{
int tmp = *p;
*p = *q;
*q = tmp;
}
size_t partition( int a[], size_t n, int pivot )
{
size_t i = 0;
while ( i != n )
{
while ( i != n && a[i] < pivot ) i++;
while ( i != n && !( a[--n] < pivot ) );
if ( i != n ) swap( a + i, a + n );
}
return i;
}
void quick_sort( int a[], size_t n )
{
if ( n != 0 )
{
size_t pos = partition( a, n - 1, a[n - 1] );
swap( a + pos, a + n - 1 );
quick_sort( a, pos );
quick_sort( a + pos + 1, n - pos - 1 );
}
}
int main(void)
{
int a[] = { 7, 2, 1, 8, 6, 3, 5, 4 };
const size_t N = sizeof( a ) / sizeof( *a );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
quick_sort( a, N );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
return 0;
}
Вывод программы
7 2 1 8 6 3 5 4
1 2 3 4 5 6 7 8