×

Quick Sort in Java

Quick Sort in Java

Like merge sort, quick sort also uses the divide and conquer approach to sort the given array or list. In quick sort, the sorting of an array is achieved by taking an element from the input array as the pivot and then split the array using the pivot.

Algorithm

STEP 1: Take either the first or the last element as the pivot element.

STEP 2: Find and place the pivot element at its correct position, i.e., the elements that are on the left side of the pivot element must be less than the pivot element. Also, elements that are on the right side of the pivot element must be greater than the pivot element.

STEP 3: Recursively execute steps 1 and 2 till the whole array is sorted.

Pseudo Code

 // start --> Beginning index, end --> Last index
quickSort(arr[], start, end)
{
    if(start >= end) return; // base case
    else
    {
        // The partition() method positions the pivot
        // at the right place, i.e., left side of pivot contains
        // elements that are less than pivot and right side of
        // pivot contains elements that are greater than pivot                   
        pivot = partition(arr, start, end);
        // Invoking the method quickSort() for the left side of pivot
        quickSort(arr, start, pivot - 1); 
        // Invoking the method quickSort() for the right side of pivot
        quickSort(arr, pivot + 1, end);
    }
} 

Java Program

The following Java program implements Quick sort using the pseudo-code defined above.

FileName: QuickSortExample.java

 public class QuickSortExample
{
// The quickSort() method takes element present at the index e
// as the pivot element to do the sorting
// s is the start index
// e is the end index
static void quickSort(int arr[], int s, int e)
{
// handling base case
if(s >= e) return;
else
{
    // pivot contains the index of the pivot element
    int pivot = partition(arr, s, e);
    // recursively sorting the left side of the pivot
    quickSort(arr, s, pivot - 1);
    // recursively sorting the right side of the pivot
    quickSort(arr, pivot + 1, e);
}
}
// the partition() method finds the
// proper position of the pivot element a[e]
// by virtually splitting the array into two subarrays.
// The left subarray contains the elements that are less than the pivot element
// the right subarray contains the elements that are greater than the pivot element
static int partition(int a[], int s, int e)
{
    // low points to the last element that is
    // less than the pivot element
    int low = s - 1;
    // iterating over every element of the array,
    // except the pivot element
    for(int i = s; i < e; i++)
    {
        if(a[i] < a[e])
        {
            // ensuring that the elements of the left part
            // is less than the pivot element.
            low = low + 1;
            int temp = a[low];
            a[low] = a[i];
            a[i] = temp;
        }
    }
    // placing the pivot element
    // at the appropriate position
    int temp = a[low + 1];
    a[low + 1] = a[e];
    a[e] = temp;
    // returning the index of the pivot element.
    return low + 1;
}
// main method
public static void main(String argvs[])
{
    // given input array
    int a[] = {67, 78, 34, 12, 30, 6, 9, 21};
    // calculating size of the input array
    int size = a.length;
    System.out.println("The array before sorting is:");
    for(int j = 0; j < size; j++)
    {
        System.out.print(a[j] + " ");
    }
    System.out.println(" \n");
    // sorting the input array using quick sort
    quickSort(a, 0, a.length - 1);
    System.out.println("The array after sorting is:");
    for(int j = 0; j < size; j++)
    {
        System.out.print(a[j] + " ");
    }
}
} 

Output:

 The array before sorting is:
67 78 34 12 30 6 9 21
The array after sorting is:
6 9 12 21 30 34 67 78 

Explanation: All we have to take care is how elements less than the pivot element take the left side of the array. It is done by the for-loop present in the partition() method. When all the elements less than the pivot element take the left side of the array, the remaining elements automatically take the right side. These remaining elements are greater than the pivot element. The pivot element can then be placed just after the ending of elements that are smaller than the pivot element. Observe the following diagram.

Quick Sort in Java

Analysis of Quick Sort

One of the main advantages of the quick sort algorithm is that it is in-place sorting. It means that it does not require no extra space for sorting. Looking from this perspective, quick sort should be preferred over the merge sort. Also, this algorithm works as quickly as merge sort.

The downsides of the algorithm are that when a sorted array is given as input, the algorithm takes O(n2) time to process the sorted array. It is worse than merge sort. It takes O(nlog(n)) time to sort the array. Note that n is the size of the input array.

Conclusion

Between merge sort and quick sort, quick sort is the better choice when the array is not sorted. If, instead of an array, a linked list is given to be sorted, go for merge sort instead of quicksort. The reason behind this is, unlike an array, randomized access of elements is not possible in a linked list, and quick sort relies heavily on the random access of elements, whereas, merge sort does not.

Also, it is found that merge sort works well for larger data sets, and quick sort works well for smaller data sets.

Time Complexity

The average and best time complexity of the quicksort is O(nlog(n)), where n is the number of elements present in the array. For sorted arrays, this sorting algorithm gives the time complexity as O(n2). Hence, the worst time complexity of this sorting algorithm is O(n2).

Space Complexity

The space complexity of the merge sort algorithm is O(1), that is, constant space complexity. Observe the code; there is no auxiliary array or any additional space used to do the sorting.


Related Topics

Java Math min() Method

The min() method of Math class returns the smaller of two arguments. The arguments can be of double, float, int or long data type. Syntax: public static double min (double a, double...

2 minutes read.

String Handling Method in Java

What is a String? Strings are a bundle of different characters that are normally used in Java programming language. Strings are regarded as objects in the Java programming language. “String” is a...

4 minutes read.

Economical number in Java

Economical number is said to be economically efficient if the number of digits after prime factorization of the original number with their powers is less than the number of digits...

3 minutes read.

How annotations work in Java

Annotations were introduced by sun microsystem and are available from the java 1.5 version. In general, configurations can be done either by XML or by annotations. Hibernate and spring framework users prefer...

4 minutes read.

Java Instanceof Keyword

To determine whether an object is an instance of the supplied type in Java, use the instanceof operator (class or subclass or interface). The type of comparison in java differentiates the...

4 minutes read.

Addition Program in Java

Addition Program in Java We can perform the addition (sum) of two or more numbers by using the arithmetic operator (+). To write an addition program in Java, one must understand...

3 minutes read.

Java Maven Silicon

Maven is a build automation tool that is mostly used for Java applications. It allows you to manage the build, reporting, and documentation of a project from the central location. Maven provides...

4 minutes read.

Factorial of a Large Number in Java

We've already talked about a number's factorial. We must still go over the factorial of a large number separately, though. The method used to determine the factorial of a small...

8 minutes read.

How to Create a Package in Java?

For the most part, how to create a package in Java generally, a package is defined as a collection of relevant or irrelevant items together in a very major way....

7 minutes read.

What is Core Java?

The fundamental Java, which includes the fundamental idea of the Java programming language, is referred to as "Core Java." The definition of "Core" is the core idea of something. Core...

3 minutes read.

Enterprise Java Beans

One of the many Java APIs for the common development of corporate software is Enterprise Java Beans (EJB). An EJB, a server-side software component, contains the business logic of an...

4 minutes read.

Java Math log1p() Method

The log1p() method of Math class returns the natural logarithmic sum for the specified double argument and 1. Its value is much closer to result of ln(1 + x). Syntax: public static...

2 minutes read.

Automorphic Number Program in Java

We will learn about automorphic numbers through examples in this article, and we'll also make Java programmes that can determine whether a specific number was automorphic or not. What is an...

3 minutes read.

How to Create an Immutable Class in Java

How to Create an Immutable Class in Java In Java, immutable means something that cannot be change. A class is called an immutable class if its content cannot be changed, once...

3 minutes read.

Converting Long to Date in Java

What Long and Date are in Java and how are they implemented in the Java programming language are the topics of this article. Additionally, we'll go into great detail on...

4 minutes read.

Annotations in Java

Annotations in Java Java Annotations are metadata about the source code. They do not have any direct effect on the execution of the java program. Annotations in Java were introduced in...

4 minutes read.

Java Type Casting

Type casting is a technique or process used in Java to convert one data type into another, either manually or automatically. The compiler performs the automatic conversion, and the programmer...

3 minutes read.

How to take Multiple String Input in Java using Scanner class

Scanner class is a class which takes the multiple input data or the single input data through an objects and methods. The Scanner class will be available in the java.util...

3 minutes read.

Java Obfuscator

Obfuscation is the process of making something unclear or difficult to interpret. Obfuscators are being used in programming to protect the source code from hackers. In this article, we will...

8 minutes read.

Java Font

The font is a Java class that is a part of java.awt package. The Serializable interface is implemented by it. The direct recognized child of a Java Font class is...

8 minutes read.