Blog Algorithm Data Structure

Heap Sort in Java: Sorting Data Efficiently

Introduction

Sorting is a classic problem in computer science, and heap sort is one of the most efficient algorithms to tackle it. This blog post will discuss how heap sort works and how it can be implemented in Java.

What is Heap Sort?

Heap sort is a comparison-based sorting technique based on a binary heap data structure. It’s similar to selection sort, where we find the maximum element and place it at the end. We repeat the same process for the remaining elements.

Understanding the Heap Data Structure

Before diving into heap sort, it’s essential to understand the binary heap data structure. A binary heap is a complete binary tree which can be either a max heap or a min heap. In a max heap, the key at the root must be maximum among all keys present in the binary heap, and the same property must be recursively true for all sub-trees in that binary tree.

Algorithm Overview

Heap sort involves two main phases:

  1. Building a heap from the unsorted data array.
  2. Repeatedly removing the largest element from the heap (the root of the heap), and then rebuilding the heap.

Heap Sort Implementation in Java

public class HeapSort {
    public void sort(int arr[]) {
        int n = arr.length;
        // Build heap (rearrange array)
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);
        // One by one extract an element from heap
        for (int i = n - 1; i >= 0; i--) {
            // Move current root to end
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            // call max heapify on the reduced heap
            heapify(arr, i, 0);
        }
    }
    // To heapify a subtree rooted with node i which is an index in arr[] and n is size of heap
    void heapify(int arr[], int n, int i) {
        int largest = i; // Initialize largest as root
        int l = 2 * i + 1; // left = 2*i + 1
        int r = 2 * i + 2; // right = 2*i + 2
        // If left child is larger than root
        if (l < n && arr[l] > arr[largest])
            largest = l;
        // If right child is larger than largest so far
        if (r < n && arr[r] > arr[largest])
            largest = r;
        // If largest is not root
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;
            // Recursively heapify the affected sub-tree
            heapify(arr, n, largest);
        }
    }
    /* A utility function to print array of size n */
    static void printArray(int arr[]) {
        int n = arr.length;
        for (int i = 0; i < n; ++i)
            System.out.print(arr[i] + " ");
        System.out.println();
    }
    // Driver code
    public static void main(String args[]) {
        int arr[] = {12, 11, 13, 5, 6, 7};
        int n = arr.length;
        HeapSort ob = new HeapSort();
        ob.sort(arr);
        System.out.println("Sorted array is");
        printArray(arr);
    }
}

Time Complexity

The time complexity of heap sort is O(n log n), which makes it very efficient for large datasets. Since it sorts in-place, it also has a space complexity of O(1).

Conclusion

Heap sort is a fantastic algorithm for sorting large numbers of elements. It is relatively simple to implement, performs well, and has a good average and worst-case time complexity.

Call to Action

Try implementing heap sort in your next Java project and see how it improves the performance of your sorting tasks. Do you have any questions about heap sort or its implementation? Leave a comment below, and let’s discuss!

Avatar

Neelabh

About Author

As Neelabh Singh, I am a Senior Software Engineer with 6.6 years of experience, specializing in Java technologies, Microservices, AWS, Algorithms, and Data Structures. I am also a technology blogger and an active participant in several online coding communities.

You may also like

Blog Design Pattern

Understanding the Builder Design Pattern in Java | Creational Design Patterns | CodeTechSummit

Overview The Builder design pattern is a creational pattern used to construct a complex object step by step. It separates
Blog Tech Toolkit

Base64 Decode

Base64 encoding is a technique used to encode binary data into ASCII characters, making it easier to transmit data over