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),效率最高的为归并排序和快速排序,归并排序的优点在于不会出现最坏情况,而快速排序的优点在于在极端情况下使用的空间较小。在实际应用中,根据数据规模和特点来选择合适的排序算法。
