【知识分享】Java实现排序的方法及代码实现

2023-12-13 19:11:19

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 - i - 1; j++) {
? ? ? ? ? ? if (arr[j] > arr[j + 1]) {
? ? ? ? ? ? ? ? int temp = arr[j];
? ? ? ? ? ? ? ? arr[j] = arr[j + 1];
? ? ? ? ? ? ? ? arr[j + 1] = temp;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

2.快速排序

快速排序是一种高效的排序算法,其基本思想是取一个基准元素,将小于它的元素放在左边,大于它的元素放在右边,再递归地对左右两部分进行排序。

代码实现:

public static void quickSort(int[] arr, int left, int right) {
? ? if (left < right) {
? ? ? ? int pivot = partition(arr, left, right);
? ? ? ? quickSort(arr, left, pivot - 1);
? ? ? ? quickSort(arr, pivot + 1, right);
? ? }
}

private static int partition(int[] arr, int left, int right) {
? ? int pivot = arr[left];
? ? int i = left + 1;
? ? int j = right;
? ? while (i <= j) {
? ? ? ? while (i <= j && arr[i] < pivot) {
? ? ? ? ? ? i++;
? ? ? ? }
? ? ? ? while (i <= j && arr[j] > pivot) {
? ? ? ? ? ? j--;
? ? ? ? }
? ? ? ? if (i <= j) {
? ? ? ? ? ? int temp = arr[i];
? ? ? ? ? ? arr[i] = arr[j];
? ? ? ? ? ? arr[j] = temp;
? ? ? ? ? ? i++;
? ? ? ? ? ? j--;
? ? ? ? }
? ? }
? ? arr[left] = arr[j];
? ? arr[j] = pivot;
? ? return j;
}

3.插入排序

插入排序是一种简单的排序算法,其思想是将待排序元素逐个插入到已排序序列中的合适位置。

代码实现:

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

4.选择排序

选择排序是一种简单的排序算法,其思想是每次从未排序的元素中选择最小(或最大)的元素,放到已排序序列的末尾。

代码实现:

public static void selectSort(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[j] < arr[minIndex]) {
? ? ? ? ? ? ? ? minIndex = j;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? int temp = arr[i];
? ? ? ? arr[i] = arr[minIndex];
? ? ? ? arr[minIndex] = temp;
? ? }
}

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);
? ? }
}

private 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 m = 0; m < temp.length; m++) {
? ? ? ? arr[left + m] = temp[m];
? ? }
}

6.堆排序

堆排序是一种利用堆的数据结构进行排序的算法,其基本思想是将待排序序列构造成一个大/小根堆,然后每次将堆顶元素(最大/最小值)放到已排序序列的末尾。

代码实现:

public static void heapSort(int[] arr) {
? ? int n = arr.length;
? ? // 构造大根堆
? ? for (int i = n / 2 - 1; i >= 0; i--) {
? ? ? ? adjustHeap(arr, i, n);
? ? }
? ? // 排序
? ? for (int i = n - 1; i > 0; i--) {
? ? ? ? swap(arr, 0, i);
? ? ? ? adjustHeap(arr, 0, i);
? ? }
}

private static void adjustHeap(int[] arr, int i, int n) {
? ? int temp = arr[i];
? ? for (int j = i * 2 + 1; j < n; j = j * 2 + 1) {
? ? ? ? if (j + 1 < n && arr[j] < arr[j + 1]) {
? ? ? ? ? ? j++;
? ? ? ? }
? ? ? ? if (arr[j] > temp) {
? ? ? ? ? ? arr[i] = arr[j];
? ? ? ? ? ? i = j;
? ? ? ? } else {
? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? arr[i] = temp;
}

private static void swap(int[] arr, int i, int j) {
? ? int temp = arr[i];
? ? arr[i] = arr[j];
? ? arr[j] = temp;
}

7.二分法排序

二分法排序,也称为折半插入排序,是一种基于插入排序的改进算法。其基本思想是将待排序序列分为已排序和未排序两部分,在已排序序列中使用二分查找找到插入位置,然后将元素插入到已排序序列的正确位置。

public static void binaryInsertionSort(int[] arr) {
? ? int n = arr.length;
? ? for (int i = 1; i < n; i++) {
? ? ? ? int target = arr[i];
? ? ? ? int left = 0;
? ? ? ? int right = i - 1;
? ? ? ? // 使用二分查找找到插入位置
? ? ? ? while (left <= right) {
? ? ? ? ? ? int mid = (left + right) / 2;
? ? ? ? ? ? if (target < arr[mid]) {
? ? ? ? ? ? ? ? right = mid - 1;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? left = mid + 1;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 将大于target的元素都向后移动一位
? ? ? ? for (int j = i - 1; j >= left; j--) {
? ? ? ? ? ? arr[j + 1] = arr[j];
? ? ? ? }
? ? ? ? arr[left] = target; // 插入元素到正确位置
? ? }
}
?

文章来源:https://blog.csdn.net/lf21qp/article/details/134978340
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。