Tutorial Playlist
Programming's most basic operation is sorting arrays, and Java offers strong tools and methods for doing so effectively. Understanding array sorting in Java is essential for efficient data processing and management, whether you're working with straightforward arrays or intricate data structures. This article will examine several ways to sort arrays in Java, including a detailed examination of various sorting algorithms and advice on how to use built-in sorting methods efficiently.
Before delving into the techniques to sort arrays in Java, let's understand what arrays are.
An array is a data structure that allows you to store a fixed-size sequence of elements of the same type. They provide a convenient way to manage and access multiple values as a single entity. In Java, arrays can hold primitive data types, such as integers or characters, as well as objects.
Each element in the array is identified by its index, which starts from 0 and goes up to the length of the array minus one. Arrays have a fixed length, meaning their size cannot be changed once defined. They offer direct access to elements based on their index, enabling efficient retrieval and manipulation of data.
In Java, there are different types of arrays based on the data they store. Let's explore the common kinds:
1. One-Dimensional Arrays
One-dimensional arrays are the most basic type of array in Java. They store elements of the same data type in a linear structure. These are accessed using an index, which starts from 0 and goes up to the length of the array minus one. One-dimensional arrays can be declared and initialized using the following syntax.
int[] numbers = new int[5];
An example of creating an integer array of size 5.
2. Multi-Dimensional Arrays
Multi-dimensional arrays allow you to store elements in multiple dimensions, such as rows and columns. The most common type is a two-dimensional array, which can be visualized as a table with rows and columns. Elements in a multidimensional array are accessed using row and column indices. Here's an example of a two-dimensional array declaration and initialization.
Int [][] matrix = new int [3][3];
3. Jagged Arrays
Jagged arrays are arrays of arrays where each row can have a different length. Unlike multi-dimensional arrays, which have a fixed number of elements in each row, these allow flexibility in the number of elements per row. Each row is an independent one-dimensional array. Here's an example of a jagged array.
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[2]; // Row 0 has 2 elements
jaggedArray[1] = new int[3]; // Row 1 has 3 elements
jaggedArray[2] = new int[4]; // Row 2 has 4 elements
To declare an array in Java, specify the type of elements it will hold, followed by square brackets and the name of the array. For example, to declare an array of integers named "numbers," you should write:
int[] numbers;
Then you need to initialize it with a specific length using the "new" keyword. For example, to create an array of five integers, you should write:
numbers = new int[5];
Once the array is declared and initialized, you can access its elements using the index. For instance, to access the first element of the "numbers" array, you should write:
int firstElement = numbers[0];
Sorting algorithms define the process of arranging elements in a specific order, such as ascending or descending. Java provides several of these that can be employed to sort arrays efficiently. Let's explore some common sorting algorithms and compare their characteristics:
1. Bubble Sort: This algorithm repeatedly compares adjacent elements and swaps them if they are in the wrong order. Bubble sort has a time complexity of O(n^2) and is suitable for small arrays or nearly sorted data.
Example:
import java.util.*;
class Main{
// Driver method to test above
public static void main(String args[]) {
//declare an array of integers
int intArray[] = [23,43,13, 65, 11, 62, 76, 83, 9, 71, 84, 34,96,80};
//print original array
System.out.println("Original array: + Arrays.toString(intArray));
int n intArray.length;
//iterate over the array comparing adjacent elements
for (int i = 0; i < n=1; i++)
for (int j = 0; j < n-i-1; j++)
//if elements not in order, swap them
if (intArray[j] > intArray[j+1]) { int temp = intArray[j];
}
intArray[j]= intArray[j+1]; intArray[j+1] = temp;
//print the sorted array
System.out.println("Sorted array: + Arrays.toString(intArray));
}
}
Output:
2. Selection Sort: The selection sort divides the array into a sorted and an unsorted part. It repeatedly selects the smallest or largest element from the unsorted part and places it in its correct position in the sorted part. Selection sort also has a time complexity of O(n^2) and performs well for small arrays.
Example:
import java.util.Arrays;
class Main {
static void sel_sort(int numArray[]) {
int n = numArray.length;
for (int i = 0; i < n - 1; i++) {
// Find the minimum element in the unsorted array
int min_idx = i;
for (int j = i + 1; j < n; j++) {
if (numArray[j] < numArray[min_idx]) {
min_idx = j;
}
}
// Swap the found minimum element with the first element
int temp = numArray[min_idx];
numArray[min_idx] = numArray[i];
numArray[i] = temp;
}
}
public static void main(String args[]) {
// Declare and print the original array
int numArray[] = {7, 5, 2, 20, 42, 15, 23, 34, 10};
System.out.println("Original Array: " + Arrays.toString(numArray));
// Call selection sort routine
sel_sort(numArray);
// Print the sorted array
System.out.println("Sorted Array: " + Arrays.toString(numArray));
}
}
Output:
3. Insertion Sort: Insertion sort builds the final sorted array one element at a time. It takes each element from the input and inserts it into its correct position in the already sorted part of the array. Insertion sort is efficient for small arrays and partially sorted data.
Example
class InsertionSort {
public static void sortInsertion(int[] sort_arr) {
for (int i = 1; i < sort_arr.length; i++) {
int key = sort_arr[i];
int j = i - 1;
while (j >= 0 && sort_arr[j] > key) {
sort_arr[j + 1] = sort_arr[j];
j--;
}
sort_arr[j + 1] = key;
}
}
public static void main(String args[]) {
int[] arr = {5, 2, 12, 12, 1};
sortInsertion(arr);
for (int i = 0; i < arr.length; ++i) {
System.out.print(arr[i] + " ");
}
}
}
Output:
4. Merge Sort: Merge sort follows the divide-and-conquer approach. It recursively divides the array into two halves, sorts them independently, and then merges the sorted halves to obtain the final array. Merge sort has a time complexity of O(n log n) and performs well for large arrays.
Example
import java.util.Arrays;
public class Mergesort {
public void mergeSort(int[] arr) {
if (arr.length <= 1) {
return;
}
int mid = arr.length / 2;
int[] left = Arrays.copyOfRange(arr, 0, mid);
int[] right = Arrays.copyOfRange(arr, mid, arr.length);
mergeSort(left);
mergeSort(right);
merge(arr, left, right);
}
private void merge(int[] arr, int[] left, int[] right) {
int i = 0, j = 0, k = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
arr[k++] = left[i++];
} else {
arr[k++] = right[j++];
}
}
while (i < left.length) {
arr[k++] = left[i++];
}
while (j < right.length) {
arr[k++] = right[j++];
}
}
public static void main(String[] args) {
int[] arr = {9, 5, 2, 7, 1, 8, 3, 6, 4};
Mergesort mergeSort = new Mergesort();
mergeSort.mergeSort(arr);
System.out.println("Sorted array:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
Output:
5. Quicksort: Quicksort also uses the divide-and-conquer technique. It selects a pivot element and partitions the remaining into two sub-arrays, one with elements smaller than the pivot and the other with elements larger than the pivot. Quicksort recursively sorts the sub-arrays. It has an average time complexity of O(n log n) and is widely used due to its efficiency.
Example:
public class Quicksort {
private int partition(int arr[], int begin, int end) {
int pivot = arr[end];
int i = (begin - 1);
for (int j = begin; j < end; j++) {
if (arr[j] <= pivot) {
i++;
int swapTemp = arr[i];
arr[i] = arr[j];
arr[j] = swapTemp;
}
}
int swapTemp = arr[i + 1];
arr[i + 1] = arr[end];
arr[end] = swapTemp;
return i + 1;
}
public void quickSort(int arr[], int begin, int end) {
if (begin < end) {
int partitionIndex = partition(arr, begin, end);
quickSort(arr, begin, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, end);
}
}
public static void main(String[] args) {
int[] arr = {6, 3, 8, 1, 9, 2};
Quicksort quickSort = new Quicksort();
quickSort.quickSort(arr, 0, arr.length - 1);
System.out.println("Sorted array:");
for (int i : arr) {
System.out.print(i + " ");
}
}
}
Output:
Each sorting algorithm has its advantages and disadvantages, making them suitable for different scenarios. Here's a summary of the characteristics of each algorithm:
Algorithm | Advantages | Disadvantages |
Bubble Sort | - Simple implementation and easy to understand - Works well for small input sizes and nearly sorted arrays | - Inefficient for large input sizes - Quadratic time complexity of O(n^2) |
Selection Sort | - Simple implementation - In-place sorting (requires only a constant amount of additional memory) | - Inefficient for large input sizes - Quadratic time complexity of O(n^2) |
Insertion Sort | - Simple implementation - Efficient for small input sizes and partially sorted arrays | - Inefficient for large input sizes - Quadratic time complexity of O(n^2) |
Merge Sort | - Guaranteed time complexity of O(n log n) in all cases - Stable sorting algorithm (maintains the relative order of equal elements) | - Requires additional memory for merging sub-arrays - Requires additional memory for merging sub-arrays |
Quick Sort | - Efficient average-case time complexity of O(n log n) - In-place sorting (requires only a constant amount of additional memory) | - Worst-case time complexity of O(n^2) - Not stable (may change the relative order of equal elements) |
Java provides built-in methods for sorting arrays, simplifying the process. Let's explore how to use these methods effectively.
How to Use Built-in Sorting Methods in Java
Java offers two main methods for sorting arrays: Arrays.sort() and Collections.sort(). The Arrays.sort() method is designed for sorting arrays of primitive types or objects that implement the Comparable interface. Collections.sort(), on the other hand, is used to sort collections, such as ArrayLists, and requires the elements to implement the comparable interface or a custom Comparator.
Examples of Java Programs to Sort Arrays in Ascending and Descending Order
To sort an array in ascending order in Java using the Arrays.sort() method, you simply pass the array as an argument to the method. Here's an example:
int[] numbers = {5, 2, 9, 1, 3};
Arrays.sort(numbers);
After executing this code, the "numbers" array will be sorted in ascending order: {1, 2, 3, 5, 9}.
Here’s a comprehensive example:
// Importing the Arrays class to use the sort method
import java.util.Arrays;
public class Example {
public static void main(String[] args) {
// Initializing an array with 10 values
int[] ar = {15, 118, 35, 29, 174, 109, 21, 92, 1, 100};
// Sorting the array in ascending order
Arrays.sort(ar);
// Printing the modified array
System.out.printf("Modified ar[]: %s", Arrays.toString(ar));
}
}
Output:
You can also use the quicksort sorting algorithm to sort the array in ascending order. For example:
public class Quicksort {
private int partition(int arr[], int begin, int end) {
int pivot = arr[end];
int i = (begin - 1);
for (int j = begin; j < end; j++) {
if (arr[j] <= pivot) {
i++;
int swapTemp = arr[i];
arr[i] = arr[j];
arr[j] = swapTemp;
}
}
int swapTemp = arr[i + 1];
arr[i + 1] = arr[end];
arr[end] = swapTemp;
return i + 1;
}
public void quickSort(int arr[], int begin, int end) {
if (begin < end) {
int partitionIndex = partition(arr, begin, end);
quickSort(arr, begin, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, end);
}
}
public static void main(String[] args) {
int[] arr = {6, 3, 8, 1, 9, 2};
Quicksort quickSort = new Quicksort();
quickSort.quickSort(arr, 0, arr.length - 1);
System.out.println("Sorted array:");
for (int i : arr) {
System.out.print(i + " ");
}
}
}
Output:
If you want to sort the array in descending order in Java, you can utilize the reverseOrder() method from the Collections class. Here's an example:
Integer[] numbers = {5, 2, 9, 1, 3};
Arrays.sort(numbers, Collections.reverseOrder());
After executing this code, the "numbers" array will be sorted in descending order: {9, 5, 3, 2, 1}.
See this comprehensive example:
// Importing the required classes
import java.util.Arrays;
import java.util.Collections;
public class Example {
public static void main(String[] args) {
// Initializing an array with 10 values
Integer[] ar = {15, 118, 35, 29, 174, 109, 21, 92, 1, 100};
// First, sorting in ascending order
// Then, using the reverseOrder() method
Arrays.sort(ar, Collections.reverseOrder());
// Printing the modified array
System.out.printf("Modified ar[]: %s", Arrays.toString(ar));
}
}
Output:
When working with large or complex arrays, it's important to consider performance and memory usage. Here are some best practices for sorting these in Java:
Arrays.sort() is a built-in method in Java that allows you to sort arrays quickly and efficiently. It is part of the java.util.Arrays class and provides a convenient way to sort arrays of primitive types and objects that implement the Comparable interface.
The Arrays.sort() method uses a highly optimized version of the quicksort algorithm for sorting arrays of primitive types. For arrays of objects, it utilizes the merge sort algorithm. Both algorithms have excellent average-case performance and are well-suited for general sorting purposes.
Using Arrays.sort() is straightforward. You pass the array you want to sort as an argument to the method, and it rearranges the elements in ascending order. The original array is modified in place, meaning no new array is created.
The arrays.sort() is specifically designed for sorting arrays. It operates directly on the array and modifies it in place. Arrays.sort() uses optimized sorting algorithms based on the type of the array (primitive or object) to achieve efficient sorting.
Collections.sort(), on the other hand, is used for sorting collections, such as ArrayLists. It requires the elements in the collection to either implement the Comparable interface or provide a custom Comparator implementation. Collections.sort() operates on the underlying List and rearranges the elements accordingly.
In addition to using built-in sorting methods, you can also sort arrays in Java without the sort method, using for loops. This approach allows for more flexibility and customization in the sorting process.
Sorting arrays is a fundamental operation in Java programming. By mastering array sorting techniques and selecting the appropriate sorting algorithm for your specific requirements, you can effectively organize and manipulate data in Java. This leads to more efficient and robust programs.
1. What is the 'Java sort list' function and how is it used in programming?
Ans: The 'Java sort list' function is a utility operation provided by the Java Collections framework, specifically used to rearrange the elements in a list in ascending order. This function is crucial in programming as it allows for efficient data organization and easy retrieval. Its usage involves calling Collections.sort() and passing the list as an argument.
2. How can I sort an ArrayList in Java?
Ans: You can use the Collections.sort() method to sort an ArrayList. Ensure that the elements in the ArrayList implement the Comparable interface or provide a custom Comparator implementation for proper sorting.
3. How can I optimize sorting performance in Java?
Ans: To optimize sorting performance, consider factors such as choosing the appropriate sorting algorithm for your data, implementing the Comparable interface or custom Comparator for objects, utilizing parallel sorting if applicable, and benchmarking and profiling your code to identify areas for improvement.
PAVAN VADAPALLI
Popular
Talk to our experts. We’re available 24/7.
Indian Nationals
1800 210 2020
Foreign Nationals
+918045604032
upGrad does not grant credit; credits are granted, accepted or transferred at the sole discretion of the relevant educational institution offering the diploma or degree. We advise you to enquire further regarding the suitability of this program for your academic, professional requirements and job prospects before enrolling. upGrad does not make any representations regarding the recognition or equivalence of the credits or credentials awarded, unless otherwise expressly stated. Success depends on individual qualifications, experience, and efforts in seeking employment.
upGrad does not grant credit; credits are granted, accepted or transferred at the sole discretion of the relevant educational institution offering the diploma or degree. We advise you to enquire further regarding the suitability of this program for your academic, professional requirements and job prospects before enr...