Introduction to Block Sort
Last Updated :
03 Dec, 2024
Block sort is a sorting algorithm that sorts an array by dividing it into blocks of fixed size, sorting each block individually, and then merging the sorted blocks back into a single sorted array. Block sort is a good choice for sorting large datasets that do not fit in memory. It can efficiently sort data in blocks that fit in memory, and then merge the sorted blocks together to obtain the final sorted array.
Approach: The block sort approach is as follows:
- Divide the input array into blocks of fixed size.
- Sort each block using a comparison-based sorting algorithm (e.x., quicksort or mergesort).
- Merge the sorted blocks back into a single sorted array using a priority queue or min-heap.
Illustration:
Let the given array be: [1, 7, 8, 2, 3, 5, 4, 6]
- Let's choose a block size of 3. So we will divide the input into blocks of 3 integers each:
- Block 1: [1, 7, 8]
- Block 2: [2, 3, 5]
- Block 3: [4, 6]
- Now we sort each block individually using a comparison-based sorting algorithm. Let's use quicksort for this example. Here are the sorted blocks:
- Block 1: [1, 7, 8]
- Block 2: [2, 3, 5]
- Block 3: [4, 6]
- Now we merge the sorted blocks together. We create a min-heap that contains the first element from each block:
min-heap: [1, 2, 4]
- We extract the minimum element from the heap, add it to the output array, and replace it with the next element from the block it came from. Continue until the heap is empty.
Iteration Details
- Extract 1 (minimum) from the heap, add it to the output:
- Output: [1]
- Replace 1 with the next element 7 from Block 1.
- Min-Heap: [2,7,4]
- Extract 2 (minimum) from the heap, add it to the output:
- Output: [1,2]
- Replace 2 with the next element 3 from Block 2.
- Min-Heap: [3,7,4]
- Extract 3 (minimum) from the heap, add it to the output:
- Output: [1,2,3]
- Replace 3 with the next element 5 from Block 2.
- Min-Heap: [4,7,5]
- Extract 4 (minimum) from the heap, add it to the output:
- Output: [1,2,3,4]
- Replace 4 with the next element 6 from Block 3.
- Min-Heap: [5,7,6]
- Extract 5 (minimum) from the heap, add it to the output:
- Output: [1,2,3,4,5]
- Replace 5 with the next element none (Block 2 is exhausted).
- Min-Heap: [6,7]
- Extract 6 (minimum) from the heap, add it to the output:
- Output: [1,2,3,4,5,6]
- Replace 6 with the next element none (Block 3 is exhausted).
- Min-Heap: [7]
- Extract 7 (minimum) from the heap, add it to the output:
- Output: [1,2,3,4,5,6,7]
- Replace 7 with the next element 8 from Block 1.
- Min-Heap: [8]
- Extract 8 (minimum) from the heap, add it to the output:
- Output: [1,2,3,4,5,6,7,8]
- Replace 8 with the next element none (Block 1 is exhausted).
- Min-Heap: []
- Final Output
The sorted array is: [1,2,3,4,5,6,7,8]
C++
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
vector<int> blockSort(vector<int> arr, int blockSize)
{
vector<vector<int> > blocks;
// Divide the input array into blocks of size blockSize
for (int i = 0; i < arr.size(); i += blockSize) {
vector<int> block;
for (int j = i; j < i + blockSize && j < arr.size();
j++) {
block.push_back(arr[j]);
}
// Sort each block and append it to the list of
// sorted blocks
sort(block.begin(), block.end());
blocks.push_back(block);
}
// Merge the sorted blocks into a single sorted list
vector<int> result;
while (!blocks.empty()) {
// Find the smallest element in the first block of
// each sorted block
int minIdx = 0;
for (int i = 1; i < blocks.size(); i++) {
if (blocks[i][0] < blocks[minIdx][0]) {
minIdx = i;
}
}
// Remove the smallest element and append it to the
// result list
result.push_back(blocks[minIdx][0]);
blocks[minIdx].erase(blocks[minIdx].begin());
// If the block is now empty, remove it from the
// list of sorted blocks
if (blocks[minIdx].empty()) {
blocks.erase(blocks.begin() + minIdx);
}
}
return result;
}
int main()
{
// Original arr
vector<int> arr = { 1, 7, 8, 2, 3, 5, 4, 6 };
cout << "Input: ";
for (int i = 0; i < arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
// Select box size
int blockSize = 3;
// Function call
vector<int> sortedArr = blockSort(arr, blockSize);
// Output the sorted array
cout << "Output: ";
for (int i = 0; i < sortedArr.size(); i++) {
cout << sortedArr[i] << " ";
}
cout << endl;
return 0;
}
Java
// Java Implementation
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class GFG {
public static List<Integer> blockSort(List<Integer> arr,
int blockSize)
{
List<List<Integer> > blocks = new ArrayList<>();
// Divide the input array into blocks of size
// blockSize
for (int i = 0; i < arr.size(); i += blockSize) {
List<Integer> block = new ArrayList<>();
for (int j = i;
j < i + blockSize && j < arr.size(); j++) {
block.add(arr.get(j));
}
// Sort each block and append it to the list of
// sorted blocks
Collections.sort(block);
blocks.add(block);
}
// Merge the sorted blocks into a single sorted list
List<Integer> result = new ArrayList<>();
while (!blocks.isEmpty()) {
// Find the smallest element in the first block
// of each sorted block
int minIdx = 0;
for (int i = 1; i < blocks.size(); i++) {
if (blocks.get(i).get(0)
< blocks.get(minIdx).get(0)) {
minIdx = i;
}
}
// Remove the smallest element and append it to
// the result list
result.add(blocks.get(minIdx).remove(0));
// If the block is now empty, remove it from the
// list of sorted blocks
if (blocks.get(minIdx).isEmpty()) {
blocks.remove(minIdx);
}
}
return result;
}
// Driver code
public static void main(String[] args)
{
// Original arr
List<Integer> arr = new ArrayList<>();
arr.add(1);
arr.add(7);
arr.add(8);
arr.add(2);
arr.add(3);
arr.add(5);
arr.add(4);
arr.add(6);
System.out.println("Input: " + arr);
// Select box size
int blockSize = 3;
// Function call
System.out.println("Output: "
+ blockSort(arr, blockSize));
}
}
Python
# Python Implementation
def block_sort(arr, block_size):
# Create an empty list to
# hold the sorted blocks
blocks = []
# Divide the input array into
# blocks of size block_size
for i in range(0, len(arr), block_size):
block = arr[i:i + block_size]
# Sort each block and append
# it to the list of sorted blocks
blocks.append(sorted(block))
# Merge the sorted blocks into
# a single sorted list
result = []
while blocks:
# Find the smallest element in
# the first block of
# each sorted block
min_idx = 0
for i in range(1, len(blocks)):
if blocks[i][0] < blocks[min_idx][0]:
min_idx = i
# Remove the smallest element and
# append it to the result list
result.append(blocks[min_idx].pop(0))
# If the block is now empty, remove
# it from the list of sorted blocks
if len(blocks[min_idx]) == 0:
blocks.pop(min_idx)
return result
# Original arr
arr = [1, 7, 8, 2, 3, 5, 4, 6]
print('Input: ', arr)
# Select box size
block_size = 3
# Function call
print('Output:', block_sort(arr, block_size))
C#
using System;
using System.Collections.Generic;
using System.Linq;
public class GFG
{
static List<int> BlockSort(List<int> arr, int blockSize)
{
List<List<int>> blocks = new List<List<int>>();
// Divide the input array into blocks of size blockSize
for (int i = 0; i < arr.Count; i += blockSize)
{
List<int> block = new List<int>();
for (int j = i; j < i + blockSize && j < arr.Count; j++)
{
block.Add(arr[j]);
}
// Sort each block and append it to the list of sorted blocks
block.Sort();
blocks.Add(block);
}
// Merge the sorted blocks into a single sorted list
List<int> result = new List<int>();
while (blocks.Any())
{
// Find the smallest element in the first block of each sorted block
int minIdx = 0;
for (int i = 1; i < blocks.Count; i++)
{
if (blocks[i][0] < blocks[minIdx][0])
{
minIdx = i;
}
}
// Remove the smallest element and append it to the result list
result.Add(blocks[minIdx][0]);
blocks[minIdx].RemoveAt(0);
// If the block is now empty, remove it from the list of sorted blocks
if (!blocks[minIdx].Any())
{
blocks.RemoveAt(minIdx);
}
}
return result;
}
static public void Main()
{
// Original arr
List<int> arr = new List<int> { 1, 7, 8, 2, 3, 5, 4, 6 };
Console.Write("Input: ");
for (int i = 0; i < arr.Count; i++)
{
Console.Write(arr[i] + " ");
}
Console.WriteLine();
// Select box size
int blockSize = 3;
// Function call
List<int> sortedArr = BlockSort(arr, blockSize);
// Output the sorted array
Console.Write("Output: ");
for (int i = 0; i < sortedArr.Count; i++)
{
Console.Write(sortedArr[i] + " ");
}
Console.WriteLine();
}
}
// This code is contributed by Siddharth Aher
JavaScript
function blockSort(arr, blockSize) {
let blocks = [];
// Divide the input array into blocks of size blockSize
for (let i = 0; i < arr.length; i += blockSize) {
let block = [];
for (let j = i; j < i + blockSize && j < arr.length; j++) {
block.push(arr[j]);
}
// Sort each block and append it to the list of sorted blocks
block.sort((a, b) => a - b);
blocks.push(block);
}
// Merge the sorted blocks into a single sorted list
let result = [];
while (blocks.length > 0) {
// Find the smallest element in the first block of each sorted block
let minIdx = 0;
for (let i = 1; i < blocks.length; i++) {
if (blocks[i][0] < blocks[minIdx][0]) {
minIdx = i;
}
}
// Remove the smallest element and append it to the result list
result.push(blocks[minIdx][0]);
blocks[minIdx].shift();
// If the block is now empty, remove it from the list of sorted blocks
if (blocks[minIdx].length === 0) {
blocks.splice(minIdx, 1);
}
}
return result;
}
// Original arr
let arr = [1, 7, 8, 2, 3, 5, 4, 6];
console.log("Input: " + arr.join(" "));
// Select box size
let blockSize = 3;
// Function call
let sortedArr = blockSort(arr, blockSize);
// Output the sorted array
console.log("Output: " + sortedArr.join(" "));
OutputInput: [1, 7, 8, 2, 3, 5, 4, 6]
Output: [1, 2, 3, 4, 5, 6, 7, 8]
Time Complexity: O(n*logn)
Auxiliary Space: O(1).
Advantages of Block Sort:
- Block sort has a relatively good worst-case time complexity of O(n*logn).
- Block sort can be efficiently parallelized by sorting each block separately in parallel.
- Block sort can handle large datasets that do not fit in memory by sorting the data in blocks that fit in memory.
Disadvantages of Block Sort:
- Block sort has a relatively high overhead due to the need to divide the input into blocks and then merge the sorted blocks together.
- The choice of block size can affect the performance of block sort. If the block size is too small, there will be more blocks to sort, which increases the overhead. If the block size is too large, the individual blocks may not fit in memory, reducing the efficiency of block sort.
Why Block Sort is better than Other Sorting Algorithms?
- Block sort is often used when sorting very large arrays that cannot fit into memory at once, as it allows the array to be sorted into smaller, more manageable pieces. In contrast, many other sorting algorithms require that the entire array be loaded into memory before sorting can begin.
- The performance characteristics of block sort can vary depending on the specific algorithm used and the size of the blocks. In general, block sorting can be very efficient for sorting large data sets. Other sorting algorithms may have different performance characteristics depending on factors such as the data distribution
- Block sort algorithms can be efficient for sorting large data sets, but they can also be complex to implement and may require specialized hardware or software
Similar Reads
Python Tutorial - Learn Python Programming Language Python is one of the most popular programming languages. Itâs simple to use, packed with features and supported by a wide range of libraries and frameworks. Its clean syntax makes it beginner-friendly. It'sA high-level language, used in web development, data science, automation, AI and more.Known fo
10 min read
DSA Tutorial - Learn Data Structures and Algorithms DSA (Data Structures and Algorithms) is the study of organizing data efficiently using data structures like arrays, stacks, and trees, paired with step-by-step procedures (or algorithms) to solve problems effectively. Data structures manage how data is stored and accessed, while algorithms focus on
7 min read
Python Interview Questions and Answers Python is the most used language in top companies such as Intel, IBM, NASA, Pixar, Netflix, Facebook, JP Morgan Chase, Spotify and many more because of its simplicity and powerful libraries. To crack their Online Assessment and Interview Rounds as a Python developer, we need to master important Pyth
15+ min read
Quick Sort QuickSort is a sorting algorithm based on the Divide and Conquer that picks an element as a pivot and partitions the given array around the picked pivot by placing the pivot in its correct position in the sorted array. It works on the principle of divide and conquer, breaking down the problem into s
12 min read
Merge Sort - Data Structure and Algorithms Tutorials Merge sort is a popular sorting algorithm known for its efficiency and stability. It follows the divide-and-conquer approach. It works by recursively dividing the input array into two halves, recursively sorting the two halves and finally merging them back together to obtain the sorted array. Merge
14 min read
Data Structures Tutorial Data structures are the fundamental building blocks of computer programming. They define how data is organized, stored, and manipulated within a program. Understanding data structures is very important for developing efficient and effective algorithms. What is Data Structure?A data structure is a st
2 min read
Python OOPs Concepts Object Oriented Programming is a fundamental concept in Python, empowering developers to build modular, maintainable, and scalable applications. By understanding the core OOP principles (classes, objects, inheritance, encapsulation, polymorphism, and abstraction), programmers can leverage the full p
11 min read
Bubble Sort Algorithm Bubble Sort is the simplest sorting algorithm that works by repeatedly swapping the adjacent elements if they are in the wrong order. This algorithm is not suitable for large data sets as its average and worst-case time complexity are quite high.We sort the array using multiple passes. After the fir
8 min read
Breadth First Search or BFS for a Graph Given a undirected graph represented by an adjacency list adj, where each adj[i] represents the list of vertices connected to vertex i. Perform a Breadth First Search (BFS) traversal starting from vertex 0, visiting vertices from left to right according to the adjacency list, and return a list conta
15+ min read
Binary Search Algorithm - Iterative and Recursive Implementation Binary Search Algorithm is a searching algorithm used in a sorted array by repeatedly dividing the search interval in half. The idea of binary search is to use the information that the array is sorted and reduce the time complexity to O(log N). Binary Search AlgorithmConditions to apply Binary Searc
15 min read