欢迎访问宙启技术站
智能推送

Java函数使用技巧:实现基本排序算法

发布时间:2023-06-17 13:39:16

排序算法是面试中经常会问到的问题,所以我们需要了解一些基本的排序算法。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提供的排序方法的优化技巧,提高代码效率。