Java数组排序(其二)(常见排序算法)
在Java中,对数组举行排序黑白经常见的需求。Java提供了多种内置方法来简化这一过程,同时也允许开辟者根据详细需求实现自定义的排序逻辑。以下是几种常用的Java数组排序方法:内置排序方法
使用Arrays.sort()
这是最直接也是最常用的方法之一。java.util.Arrays类提供了一个静态方法sort(),它可以对根本数据范例(如int、double等)以及实现了Comparable接口的对象数组举行升序排序。对于对象数组,默认情况下是按照自然顺序排序,即对象必须实现Comparable接口,而且定义了比较规则。
升序排序:只需要调用Arrays.sort(array)即可完成从小到大的排序。
降序排序:可以通过传递一个Comparator对象给Arrays.sort()来改变排序顺序。比方,使用Collections.reverseOrder()作为参数可以实现从大到小的排序。
import java.util.Arrays;
import java.util.Collections;
public class SortExample {
public static void main(String[] args) {
Integer[] numbers = {5, 3, 9, 1, 4};
Arrays.sort(numbers, Collections.reverseOrder());
System.out.println(Arrays.toString(numbers));
}
} 使用Collections.sort()
当处理的是实现了List接口的数据布局时,比如ArrayList,可以使用java.util.Collections提供的sort()方法。这个方法同样支持通过传递Comparator来自定义排序规则。需要注意的是,Collections.sort()只能用于列表范例的集合,不能直策应用于普通数组。
自定义排序算法
除了利用内置的方法外,还可以本身编写排序算法。固然这通常不是必须的,但在某些特殊情况下可能会更加灵活或性能更优。常见的手工实现的排序算法包罗但不限于:
冒泡排序:通过重复地遍历要排序的列表,依次比较相邻元素并交换它们的位置,直到整个列表变得有序为止。只管简朴易懂,但其时间复杂度为O(n^2),效率较低。
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int n = arr.length;
boolean swapped;
for (int i = 0; i < n - 1; i++) {
swapped = false;
for (int j = 0; j < n - 1 - i; j++) {
if (arr > arr) {
// Swap arr and arr
int temp = arr;
arr = arr;
arr = temp;
swapped = true;
}
}
// If no two elements were swapped by inner loop, then break
if (!swapped)
break;
}
}
public static void main(String[] args) {
int[] array = {64, 34, 25, 12, 22, 11, 90};
System.out.println("Unsorted array: " + Arrays.toString(array));
bubbleSort(array);
System.out.println("Sorted array: " + Arrays.toString(array));
}
} 选择排序:每次从未排序部门选出最小(或最大)的一个元素,将其放到已排序序列的末尾。它的时间复杂度同样是O(n^2),但在特定条件下可能比冒泡排序更快。
public class SelectionSort {
public static void selectionSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr < arr) {
minIndex = j;
}
}
// Swap arr and arr
int temp = arr;
arr = arr;
arr = temp;
}
}
public static void main(String[] args) {
int[] array = {64, 25, 12, 22, 11};
System.out.println("Unsorted array: " + Arrays.toString(array));
selectionSort(array);
System.out.println("Sorted array: " + Arrays.toString(array));
}
} 插入排序:构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。适用于小规模数据集。
public class InsertionSort {
public static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; ++i) {
int key = arr;
int j = i - 1;
/* Move elements of arr, that are greater than key,
to one position ahead of their current position */
while (j >= 0 && arr > key) {
arr = arr;
j = j - 1;
}
arr = key;
}
}
public static void main(String[] args) {
int[] array = {12, 11, 13, 5, 6};
System.out.println("Unsorted array: " + Arrays.toString(array));
insertionSort(array);
System.out.println("Sorted array: " + Arrays.toString(array));
}
} 快速排序:接纳分治法策略,将原问题分解成若干个规模较小的问题,然后递归求解子问题。它是实践中非常高效的排序算法之一,平均时间复杂度为O(n log n)。Arrays.sort()内部对于根本数据范例实际上就是基于优化后的快速排序实现。
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// pi is partitioning index, arr is now at right place
int pi = partition(arr, low, high);
// Recursively sort elements before partition and after partition
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr;
int i = (low - 1); // Index of smaller element
for (int j = low; j < high; j++) {
// If current element is smaller than or equal to pivot
if (arr <= pivot) {
i++;
// Swap arr and arr
int temp = arr;
arr = arr;
arr = temp;
}
}
// Swap arr and arr (or pivot)
int temp = arr;
arr = arr;
arr = temp;
return i + 1;
}
public static void main(String[] args) {
int[] array = {10, 7, 8, 9, 1, 5};
int n = array.length;
System.out.println("Unsorted array: " + Arrays.toString(array));
quickSort(array, 0, n - 1);
System.out.println("Sorted array: " + Arrays.toString(array));
}
} 其他排序方式
[*] Shell排序:希尔排序是一种改进版的插入排序,它通过比较相隔肯定间隔的元素来举行排序,随着排序的举行逐渐减少间隔直至变为1。这种方法可以在肯定程度上提高插入排序的效率。
public class ShellSort {
public static void shellSort(int[] arr) {
int n = arr.length;
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i++) {
int temp = arr;
int j;
for (j = i; j >= gap && arr > temp; j -= gap) {
arr = arr;
}
arr = temp;
}
}
}
public static void main(String[] args) {
int[] array = {23, 12, 1, 8, 34, 54, 2, 3};
System.out.println("Unsorted array: " + Arrays.toString(array));
shellSort(array);
System.out.println("Sorted array: " + Arrays.toString(array));
}
}
[*] 归并排序:该算法也是基于分治思想,但是与快速排序差异的是,它总是将数组分成两半,分别对左右双方排序后再归并结果。Arrays.sort()对于对象数组会使用归并排序以保证稳固性。
分别有这个实例
递归排序:快速排序
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// pi is partitioning index, arr is now at right place
int pi = partition(arr, low, high);
// Recursively sort elements before partition and after partition
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr;
int i = (low - 1); // Index of smaller element
for (int j = low; j < high; j++) {
// If current element is smaller than or equal to pivot
if (arr <= pivot) {
i++;
// Swap arr and arr
int temp = arr;
arr = arr;
arr = temp;
}
}
// Swap arr and arr (or pivot)
int temp = arr;
arr = arr;
arr = temp;
return i + 1;
}
public static void main(String[] args) {
int[] array = {10, 7, 8, 9, 1, 5};
System.out.println("Unsorted array: " + Arrays.toString(array));
quickSort(array, 0, array.length - 1);
System.out.println("Sorted array: " + Arrays.toString(array));
}
} 数学计算:斐波那契数列
public class Fibonacci {
public static int getFibonacci(int number) {
if (number <= 1) {
return number;
}
return getFibonacci(number - 1) + getFibonacci(number - 2);
}
public static void main(String[] args) {
int n = 10; // Example input
System.out.println("Fibonacci number at position " + n + ": " + getFibonacci(n));
}
} 这位博主有动态效果图有兴趣可以进往观看:https://juejin.cn/post/694175771133211444
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]