Java函数使用技巧:实现基本排序算法
排序算法是面试中经常会问到的问题,所以我们需要了解一些基本的排序算法。Java语言提供了较为丰富的排序方法,我们可以借助Java提供的方法来学习排序算法的实现。本文将介绍冒泡排序、选择排序、插入排序和快速排序四种基本排序算法的实现,并对Java中常用的排序方法提供一些使用技巧。
一、冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序方法,它采用比较相邻的元素并交换顺序,直到没有需要交换的元素为止。冒泡排序的时间复杂度为O(n2)。
Java中实现冒泡排序的代码如下:
public void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
优化思路:
1. 记录上一次交换的位置,减少无用的比较;
2. 若一次遍历中没有发生交换,则已经排好序,可以直接退出。
Java中优化后的冒泡排序代码如下:
public void bubbleSort2(int[] arr) {
int n = arr.length;
int lastSwap = 0;
int swapBorder = n - 1;
for (int i = 0; i < n - 1; i++) {
boolean flag = true;
for (int j = 0; j < swapBorder; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = false;
lastSwap = j;
}
}
swapBorder = lastSwap;
if (flag) {
break;
}
}
}
二、选择排序(Selection Sort)
选择排序是一种简单的排序方法,它每次找到n个元素中最小的元素,将其与第一个元素交换位置,然后在n-1个元素中找到最小元素,将其与第二个元素交换位置,以此类推。选择排序的时间复杂度为O(n2)。
Java中实现选择排序的代码如下:
public void selectionSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
三、插入排序(Insertion Sort)
插入排序是一种简单的排序方法,它将一个元素插入已有序的有限序列中,插入后仍然有序。插入排序的时间复杂度为O(n2)。
Java中实现插入排序的代码如下:
public void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int j = i - 1;
int temp = arr[i];
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
}
四、快速排序(Quick Sort)
快速排序是一种常用的排序方法,它采用分治法将一个数组分成两个子数组,再对子数组进行排序,最后将结果合并起来。快速排序的时间复杂度为O(nlogn)。
Java中实现快速排序的代码如下:
public void quickSort(int[] arr, int left, int right) {
if (left < right) {
int pivotIndex = partition(arr, left, right);
quickSort(arr, left, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, right);
}
}
public int partition(int[] arr, int left, int right) {
int pivot = arr[right];
int i = left;
for (int j = left; j <= right - 1; j++) {
if (arr[j] < pivot) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
}
}
int temp = arr[i];
arr[i] = arr[right];
arr[right] = temp;
return i;
}
Java中常用的排序方法
Java中提供了很多常用的排序方法:Arrays.sort()、Collections.sort()、Stream.sorted()等。这些方法利用了高效的排序算法,并且使用方便、调用简单。除了排序方法的使用外,我们还可以使用一些技巧优化排序效率。
1. 排序前进行判断
在使用Arrays.sort()等排序方法时,我们可以使用Arrays.binarySearch()等方法判断数组是否已经排好序。如果已经排好序,则可以跳过排序这一步,提升代码效率。
if (Arrays.binarySearch(arr, target) < 0) {
Arrays.sort(arr);
}
2. 使用自定义比较器
Collections.sort()和Stream.sorted()方法都支持自定义比较器。通过自定义比较器可以实现根据对象的某一属性进行排序、实现特定的排序顺序(如降序排序)等操作。
// 根据name属性进行升序排序 Collections.sort(list, Comparator.comparing(Student::getName)); // 根据id属性进行降序排序 list.stream().sorted(Comparator.comparing(Student::getId).reversed());
3. 使用并行排序
Java中的并行排序可以利用多线程进行加速,提高排序效率。我们可以使用parallelSort()方法实现并行排序。
Arrays.parallelSort(arr);
总结
本文介绍了冒泡排序、选择排序、插入排序和快速排序四种基本排序算法的实现,并提供了Java中常用的排序方法的使用技巧。在实际开发中,我们需要根据具体情况选择合适的排序方法和算法,并充分利用Java提供的排序方法的优化技巧,提高代码效率。
