Sorting – Quick Sort

Time complexity:

Worst-case: \(O(n^2)\)

Best-case: \(O(nlog(n))\)

Average-case: \(O(nlog(n))\)

Pick a random element (pivot) and partition the array.
[all numbers that are less than the pivot] pivot [all numbers that are greater than the pivot]

 

Version 1.

void QuickSort(int *list, int size)
{
    sortStep(list, size, 0, size-1);
}

int partition(int *list, int size, int left, int right, int pivotIndex)
{
    int pivot = list[pivotIndex];
    int i, index = left;
    swap(&list[right], &list[pivotIndex]);
    for(i=left;i<right;i++)
    {
        if(list[i] < pivot)
        {
            swap(&list[index++],&list[i]);
        }
    }
    swap(&list[index], &list[right]);
    return index;
}

void sortStep(int *list, int size, int left, int right)
{
    if(left < right)
    {
        //pick up a pivot
        srand(time(NULL));
        int pivotIndex =  rand()%(right-left+1) + left; // make sure the range you set is correct
        int index = partition(list, size, left, right, pivotIndex);
        sortStep(list, size, left, index-1);
        sortStep(list, size, index+1, right);
    }
}

Version 2.

void QuickSort(int *list, int size)
{
    sortStep(list, size, 0, size-1);
}

int partition(int *list, int size, int left, int right, int pivotIndex)
{
    
    if(left < right)
    {
        int i, j, leftIndex=left, rightIndex=right;
        while(list[leftIndex] < list[pivotIndex]) leftIndex++; while(list[rightIndex] > list[pivotIndex])
            rightIndex--;

        while(leftIndex < rightIndex)
        {
            swap(&list[leftIndex], &list[rightIndex]);
            
            leftIndex++;
            rightIndex--;
            
            while(list[leftIndex] < list[pivotIndex]) leftIndex++; while(list[rightIndex] > list[pivotIndex])
                rightIndex--;
        }
        swap(&list[rightIndex], &list[pivotIndex]);
        return rightIndex;
    }
}

void sortStep(int *list, int size, int left, int right)
{
    if(left < right)
    {
        //pick up a pivot
        int pivotIndex = left; //set first element as our pivot
        int index = partition(list, size, left, right, pivotIndex);
        sortStep(list, size, left, index-1);
        sortStep(list, size, index+1, right);
    }
}

 

 

 

 

 

Leave a Reply