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

Java如何排序一个整数数组

发布时间:2023-05-23 20:31:43

Java中排序一个整数数组有多种方式,常见的包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。下面将介绍这些排序算法的基本思想和实现方法,并且进行比较。

1.冒泡排序

冒泡排序是一种简单的排序算法,它通过多次交换相邻两个数的位置,从而将最大(小)的数逐渐“冒泡”到数组的末尾(开头)。具体实现如下:

public static void bubbleSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

时间复杂度为O(n^2),不适合处理大规模数据。

2.插入排序

插入排序的基本思想是:将一个元素插入到已经排好序的数组中,使得数组仍然有序。具体实现如下:

public static void insertSort(int[] arr) {
    int n = arr.length;
    for (int i = 1; i < n; i++) {
        int temp = arr[i];
        int j = i;
        while (j > 0 && arr[j - 1] > temp) {
            arr[j] = arr[j - 1];
            j--;
        }
        arr[j] = temp;
    }
}

时间复杂度为O(n^2),效率略高于冒泡排序。

3.选择排序

选择排序的基本思想是:每一次从未排序的数组中选择最小(大)的数,放在已排序的数组的末尾(开头)。具体实现如下:

public static void selectSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        int min = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
}

时间复杂度为O(n^2),效率略高于冒泡排序,但是比插入排序略低。

4.快速排序

快速排序是一种常用的排序算法,它通过分治的方式将大问题变成小问题,递归处理子问题,最终得到有序的序列。具体实现如下:

public static void quickSort(int[] arr, int left, int right) {
    int i = left;
    int j = right;
    int pivot = arr[(left + right) / 2];
    while (i <= j) {
        while (arr[i] < pivot) {
            i++;
        }
        while (arr[j] > pivot) {
            j--;
        }
        if (i <= j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    if (left < j) {
        quickSort(arr, left, j);
    }
    if (i < right) {
        quickSort(arr, i, right);
    }
}

时间复杂度为O(nlogn),效率较高,但是在最坏情况下可能达到O(n^2)。

5.归并排序

归并排序是一种稳定的排序算法,它利用分治的思想将问题划分为小问题,递归求解,最后将子问题的解合并成问题的解。具体实现如下:

public static void mergeSort(int[] arr, int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

public static void merge(int[] arr, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];
    int i = left;
    int j = mid + 1;
    int k = 0;
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    for (int p = 0; p < temp.length; p++) {
        arr[left + p] = temp[p];
    }
}

时间复杂度为O(nlogn),效率较高,且不会出现最坏情况。

比较

以上五种常用的排序算法,时间复杂度都为O(n^2)或O(nlogn),效率最高的为归并排序和快速排序,归并排序的优点在于不会出现最坏情况,而快速排序的优点在于在极端情况下使用的空间较小。在实际应用中,根据数据规模和特点来选择合适的排序算法。