'Hoare partition correctness

according to introduction to algorithms I wrote a code for quicksort using Hoare's partition in the codeblocks IDE .The code was successfully built but the sorted array is not displayed on the console,only the unsorted array is displayed followed by a blinking underscore.

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int partition(int arr[],int p,int r)
{
    int i,j,x,temp;
    x=arr[p];
    i=p-1;
    j=r+1;
    while(true)
    {
        do{
            j=j-1;
          }while(arr[j]<=x);
        do{
            i=i+1;
          }while(arr[i]>=x);
        if (i<j)
        {
            temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
        }
        else
            return j;
    }

}
void quicksort(int arr[],int p,int r)
{
    if (p<r)
    {
        int q=partition(arr,p,r);
              quicksort(arr,p,q-1);
              quicksort(arr,q-1,r);
    }
}
void print(int A[],int size)
{
    int i;
    for(i=0;i<size;i++)
        printf("%d ",A[i]);
}
int main()
{
    int arr[]={1,12,56,2,67,0,98,23};
    int size=sizeof(arr)/sizeof(arr[0]);
    printf("\nthe array is\n");
    print(arr,size);

    quicksort(arr,0,size-1);
    printf("\nthe  sorted array is\n ");
    print(arr,size);
    return 0;
}

the output was as follows

the array is
1 12 56 2 67 0 98 23

`

c


Solution 1:[1]

Okay, I refactored your algorithm, based on a guide from wikipedia: https://en.wikipedia.org/wiki/Quicksort

As mentioned in my comment above, the [recursive] quicksort calls used the wrong arguments. But, then, as Weather Vane mentioned, it [still] didn't sort.

Edit: My original post was using Lomuto partitioning instead of Hoare.

The partition algorithm differed from the wiki by using a different initial value for the pivot and using <=,>= on the do/while termination conditions instead of <,>

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

int
partition(int arr[], int p, int r)
{
    int i,
     j,
     x,
     temp;

    x = arr[(p + r) / 2];

    i = p - 1;
    j = r + 1;

    while (1) {
        do {
            i += 1;
        } while (arr[i] < x);

        do {
            j -= 1;
        } while (arr[j] > x);

        if (i >= j)
            return j;

        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

void
quicksort(int arr[], int p, int r)
{
    if (p < r) {
        int q = partition(arr, p, r);
        quicksort(arr, p, q);
        quicksort(arr, q + 1, r);
    }
}

void
print(int A[], int size)
{
    int i;

    for (i = 0; i < size; i++)
        printf("%d ", A[i]);
}

int
main()
{
    int arr[] = { 1, 12, 56, 2, 67, 0, 98, 23 };
    int size = sizeof(arr) / sizeof(arr[0]);

    printf("\nthe array is\n");
    print(arr, size);

    quicksort(arr, 0, size - 1);
    printf("\nthe  sorted array is\n ");
    print(arr, size);
    printf("\n");

    return 0;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1