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

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; // 插入元素到正确位置

}

}

相关推荐
egekm_sefg11 分钟前
【微服务】SpringCloud 1-9章
java
计算机-秋大田19 分钟前
基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)
java·前端·后端·微信小程序·小程序·课程设计
等一场春雨1 小时前
Springboot Redisson 分布式锁、缓存、消息队列、布隆过滤器
java·spring boot·分布式
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
码农研究僧1 小时前
Redis 中 TTL 的基本知识与禁用缓存键的实现策略(Java)
java·redis·缓存·缓存策略
落霞的思绪1 小时前
令牌主动失效机制实现——Redis登录优化
java·redis
爱吃涮毛肚的肥肥(暂时吃不了版)1 小时前
Leetcode——链表:143.重排链表
数据结构·c++·后端·算法·leetcode·链表·职场和发展
dundunmm2 小时前
论文阅读:Structure-Driven Representation Learning for Deep Clustering
论文阅读·人工智能·算法·数据挖掘·聚类·深度聚类
苏-言2 小时前
SpringMVC 实战指南:文件上传
java·后端·spring
m0_748250742 小时前
SpringMVC详解
java