【知识分享】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 (arrj > arrj + 1) {

int temp = arrj;

arrj = arrj + 1;

arrj + 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 = arrleft;

int i = left + 1;

int j = right;

while (i <= j) {

while (i <= j && arri < pivot) {

i++;

}

while (i <= j && arrj > pivot) {

j--;

}

if (i <= j) {

int temp = arri;

arri = arrj;

arrj = temp;

i++;

j--;

}

}

arrleft = arrj;

arrj = pivot;

return j;

}

3.插入排序

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

代码实现:

public static void insertSort(int\[\] arr) {

int n = arr.length;

for (int i = 1; i < n; i++) {

int key = arri;

int j = i - 1;

while (j >= 0 && arrj > key) {

arrj + 1 = arrj;

j--;

}

arrj + 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 (arrj < arrminIndex) {

minIndex = j;

}

}

int temp = arri;

arri = arrminIndex;

arrminIndex = 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 intright - left + 1; // 临时数组

int i = left; // 左序列指针

int j = mid + 1; // 右序列指针

int k = 0; // 临时数组指针

while (i <= mid && j <= right) {

if (arri <= arrj) {

tempk++ = arri++;

} else {

tempk++ = arrj++;

}

}

while (i <= mid) {

tempk++ = arri++;

}

while (j <= right) {

tempk++ = arrj++;

}

// 将临时数组中的元素复制到原数组中

for (int m = 0; m < temp.length; m++) {

arrleft + m = tempm;

}

}

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 = arri;

for (int j = i * 2 + 1; j < n; j = j * 2 + 1) {

if (j + 1 < n && arrj < arrj + 1) {

j++;

}

if (arrj > temp) {

arri = arrj;

i = j;

} else {

break;

}

}

arri = temp;

}

private static void swap(int\[\] arr, int i, int j) {

int temp = arri;

arri = arrj;

arrj = temp;

}

7.二分法排序

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

public static void binaryInsertionSort(int\[\] arr) {

int n = arr.length;

for (int i = 1; i < n; i++) {

int target = arri;

int left = 0;

int right = i - 1;

// 使用二分查找找到插入位置

while (left <= right) {

int mid = (left + right) / 2;

if (target < arrmid) {

right = mid - 1;

} else {

left = mid + 1;

}

}

// 将大于target的元素都向后移动一位

for (int j = i - 1; j >= left; j--) {

arrj + 1 = arrj;

}

arrleft = target; // 插入元素到正确位置

}

}

相关推荐
冷小鱼几秒前
AI Agent 核心算法:任务规划(Planning)的深度技术解析
人工智能·算法·planning
退休倒计时8 分钟前
【每日一题】LeetCode 78. 子集 TypeScript
算法·leetcode·typescript
旖-旎12 分钟前
《LeetCode 978 最长湍流子数组 || LeetCode 139 单词拆分》
c++·算法·leetcode·动态规划
人道领域16 分钟前
【0-1的agent进阶篇】Prompt 与上下文工程
java·开发语言·prompt·mcp
cxr82822 分钟前
第16章 跨域迁移与能力融合——从专家到通才
人工智能·算法·智能体·hermes
学究天人29 分钟前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(补充卷9)
人工智能·线性代数·算法·数学建模·动态规划·原型模式·抽象代数
Keven_1136 分钟前
算法札记:图的存储方式
算法·图论
KINGSEA_16839 分钟前
AgentScope Java 2.0 架构解析
java
斯文的八宝粥44 分钟前
SERL:让真机强化学习从“难用”走向“可复现”的强化学习框架 ----(4)算法篇(DrQ vs VICE)
算法
yangdaxiageo1 小时前
算法时代的“心智置顶“:《功夫女足》如何构建GEO正向飞轮
人工智能·科技·算法·aigc