mirror of
https://github.com/TheAlgorithms/C
synced 2024-11-25 14:59:36 +03:00
Create random_quick_sort.c
This commit is contained in:
parent
daef3ff12c
commit
7f350fd507
95
sorting/random_quick_sort.c
Normal file
95
sorting/random_quick_sort.c
Normal file
@ -0,0 +1,95 @@
|
||||
/*
|
||||
Randomised quick sort implementation in C language.
|
||||
In normal quick sort, pivot chosen to partition is either the first or the last element of the array.
|
||||
This can take time O(n*n) to sort in the worst case.
|
||||
Now in randomised quick sort, pivot is randomly chosen and then recursively sort the left and right sub-arrays.
|
||||
The expected running time of the algorithm is O(nlog(n)).
|
||||
*/
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<time.h>
|
||||
|
||||
int getBig(int a[], int i, int right, int pivot)
|
||||
{
|
||||
for(int k = i; k <= right; k++)
|
||||
{
|
||||
if (a[k] > pivot)
|
||||
return k;
|
||||
}
|
||||
return right+1;
|
||||
}
|
||||
|
||||
int getSmall(int a[], int j, int left, int pivot)
|
||||
{
|
||||
for(int k = j; k >= left; k--)
|
||||
{
|
||||
if (a[k] < pivot)
|
||||
return k;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void swap(int *a, int *b)
|
||||
{
|
||||
int t = *a;
|
||||
*a = *b;
|
||||
*b = t;
|
||||
}
|
||||
|
||||
void random_quick(int a[], int left, int right)
|
||||
{
|
||||
if (left>=right)
|
||||
return;
|
||||
int index = left + (rand()%(right-left)), i = left, j = right;
|
||||
int pivot_index = index;
|
||||
int pivot = a[index];
|
||||
// storing index of element greater than pivot
|
||||
i = getBig(a, i, right, pivot);
|
||||
// storing index of element smaller than pivot
|
||||
j = getSmall(a, j, left, pivot);
|
||||
while(i <= j)
|
||||
{
|
||||
swap(&a[i], &a[j]);
|
||||
i = getBig(a, i, right, pivot);
|
||||
j = getSmall(a, j, left, pivot);
|
||||
}
|
||||
// after separating the smaller and greater elements, there are 3 cases possible
|
||||
if(pivot_index>j && pivot_index>i)
|
||||
{
|
||||
// case 1. When the pivot element index is greater than both i and j
|
||||
swap(&a[i], &a[pivot_index]);
|
||||
random_quick(a, left, i-1);
|
||||
random_quick(a, i+1, right);
|
||||
}
|
||||
else if (pivot_index<j && pivot_index<i)
|
||||
{
|
||||
// case 2. When the pivot element index is smaller than both i and j
|
||||
swap(&a[j], &a[pivot_index]);
|
||||
random_quick(a, left, j-1);
|
||||
random_quick(a, j+1, right);
|
||||
}
|
||||
else
|
||||
{
|
||||
// the pivot element is at its origin position.
|
||||
random_quick(a, left, pivot_index-1);
|
||||
random_quick(a, pivot_index+1, right);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
srand(time(0));
|
||||
int num;
|
||||
scanf("%d", &num);
|
||||
int arr[num];
|
||||
for(int i = 0; i < num; i++)
|
||||
{
|
||||
scanf("%d", &arr[i]);
|
||||
}
|
||||
random_quick(arr, 0, num-1);
|
||||
for(int i = 0; i < num; i++)
|
||||
{
|
||||
printf("%d ", arr[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
Loading…
Reference in New Issue
Block a user