八大排序(Java实现)+ 桶排序

2024-05-27 03:04
文章标签 java 实现 排序 八大

本文主要是介绍八大排序(Java实现)+ 桶排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

准备工作

排序规则

按照自然序排序(从左往右,从小到大)

工具类

public class SortUtil {/*** 交换 arr[a] 与 arr[b]* @param arr 数组* @param a index a* @param b index b*/public static void swap(int[] arr, int a, int b) {int temp = arr[a];arr[a] = arr[b];arr[b] = temp;}
}

测试类

public class EightSortMethod {public static void main(String[] args) {int[] arr;// 1. 冒泡排序(Bubble Sort): 通过相邻元素的比较和交换来将较大的元素逐渐从后面移动到数组的末尾,较小的元素逐渐从前面移动到数组的开头。arr = new int[]{1, 5, 8, 2, 6, 0, 16, 88, 29, 91, 777};System.out.println(Arrays.toString(BubbleSort.sort(arr)));// 2. 选择排序(Selection Sort): 每次从未排序的部分选择最小(或最大)的元素,然后将其与未排序部分的第一个元素交换,直到所有元素排序完成。arr = new int[]{1, 5, 8, 2, 6, 0, 16, 88, 29, 91, 777};System.out.println(Arrays.toString(SelectionSort.sort(arr)));// 3. 插入排序(Insertion Sort): 将数组分成已排序和未排序两部分,每次从未排序部分取出一个元素插入到已排序部分的适当位置,直到所有元素都插入完毕。arr = new int[]{1, 5, 8, 2, 6, 0, 16, 88, 29, 91, 777};System.out.println(Arrays.toString(InsertionSort.sort(arr)));// 4. 希尔排序(Shell Sort): 是插入排序的一种改进版本,它通过将数组分成多个子序列来排序,每个子序列使用插入排序进行排序,不断缩小子序列的间隔直到为1。arr = new int[]{1, 5, 8, 2, 6, 0, 16, 88, 29, 91, 777};System.out.println(Arrays.toString(ShellSort.sort(arr)));// 5. 归并排序(Merge Sort): 采用分治法的思想,将数组递归地分成两个子数组,然后将两个有序子数组合并为一个有序数组,直到整个数组有序。arr = new int[]{1, 5, 8, 2, 6, 0, 16, 88, 29, 91, 777};System.out.println(Arrays.toString(MergeSort.sort(arr)));// 6. 快速排序(Quick Sort): 也是采用分治法的思想,通过选取一个基准元素,将数组分成两个子数组,左边的子数组小于等于基准元素,右边的子数组大于基准元素,然后递归地对两个子数组进行排序。arr = new int[]{1, 5, 8, 2, 6, 0, 16, 88, 29, 91, 777};System.out.println(Arrays.toString(QuickSort.sort(arr)));// 7. 堆排序(Heap Sort): 利用堆这种数据结构来实现的一种排序算法,通过构建最大堆(或最小堆)来实现排序。arr = new int[]{1, 5, 8, 2, 6, 0, 16, 88, 29, 91, 777};System.out.println(Arrays.toString(HeapSort.sort(arr)));// 8. 计数排序(Counting Sort): 非比较排序算法,适用于一定范围内的整数排序,它通过统计每个元素的个数来实现排序。arr = new int[]{1, 5, 8, 2, 6, 0, 16, 88, 29, 91, 777};System.out.println(Arrays.toString(CountingSort.sort(arr)));}
}

1. 冒泡排序(Bubble Sort)

通过相邻元素的比较和交换来将较大的元素逐渐从后面移动到数组的末尾,较小的元素逐渐从前面移动到数组的开头。

public class BubbleSort {public static int[] sort(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]) SortUtil.swap(arr, j, j + 1);}}return arr;}
}

2. 选择排序(Selection Sort)

每次从未排序的部分选择最小(或最大)的元素,然后将其与未排序部分的第一个元素交换,直到所有元素排序完成。

public class SelectionSort {public static int[] sort(int[] arr) {int n = arr.length;for (int i = 0; i < n; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) minIndex = j;}SortUtil.swap(arr, i, minIndex);}return arr;}
}

3. 插入排序(Insertion Sort)

将数组分成已排序和未排序两部分,每次从未排序部分取出一个元素插入到已排序部分的适当位置,直到所有元素都插入完毕。

public class InsertionSort {public static int[] sort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {int x = arr[i];int end = i-1;while (end >= 0 && arr[end] > x) {arr[end + 1] = arr[end];end--;}arr[end+1] = x;}return arr;}
}

4. 希尔排序(Shell Sort)

是插入排序的一种改进版本,它通过将数组分成多个子序列来排序,每个子序列使用插入排序进行排序,不断缩小子序列的间隔直到为1。

public class ShellSort {public static int[] sort(int[] arr) {int n = arr.length;for (int gap = n / 2; gap > 0; gap /= 2) {for (int i = gap; i < n; i++) {int x = arr[i];int end = i - gap;while (end >= 0 && arr[end] > x) {arr[end + gap] = arr[end];end -= gap;}arr[end + gap] = x;}}return arr;}
}

5. 归并排序(Merge Sort)

采用分治法的思想,将数组递归地分成两个子数组,然后将两个有序子数组合并为一个有序数组,直到整个数组有序。

public class MergeSort {public static int[] sort(int[] arr) {mergeSort(arr, 0, arr.length - 1);return arr;}private static void mergeSort(int[] arr, int l, int r) {if (l >= r) return;int m = l + (r - l) / 2;mergeSort(arr, l, m);mergeSort(arr, m + 1, r);merge(arr, l, m, r);}private static void merge(int[] arr, int l, int m, int r) {int leftLen = m - l + 1;int rightLen = r - m;int[] left = new int[leftLen];int[] right = new int[rightLen];for (int i = 0; i < leftLen; i++) left[i] = arr[l + i];for (int i = 0; i < rightLen; i++) right[i] = arr[m + 1 + i];int lIndex = 0, rIndex = 0, mergeIndex = l;while (lIndex < leftLen && rIndex < rightLen) {arr[mergeIndex++] = left[lIndex] < right[rIndex] ? left[lIndex++] : right[rIndex++];}while (lIndex < leftLen) {arr[mergeIndex++] = left[lIndex++];}while (rIndex < rightLen) {arr[mergeIndex++] = right[rIndex++];}}
}

6. 快速排序(Quick Sort)

也是采用分治法的思想,通过选取一个基准元素,将数组分成两个子数组,左边的子数组小于等于基准元素,右边的子数组大于基准元素,然后递归地对两个子数组进行排序。

public class QuickSort {public static int[] sort(int[] arr) {quickSort(arr, 0, arr.length - 1);return arr;}private static void quickSort(int[] arr, int l, int r) {if (l >= r) return;int pivot = partition(arr, l, r);quickSort(arr, l, pivot - 1);quickSort(arr, pivot + 1, r);}private static int partition(int[] arr, int l, int r) {int pivot = l;while (l < r) {while (l < r && arr[r] >= arr[pivot]) r--;while (l < r && arr[l] <= arr[pivot]) l++;SortUtil.swap(arr, l, r);}SortUtil.swap(arr, l, pivot);return l;}
}

7. 堆排序(Heap Sort)

利用堆这种数据结构来实现的一种排序算法,通过构建最大堆(或最小堆)来实现排序。

public class HeapSort {public static int[] sort(int[] arr) {int n = arr.length;// 建立大根堆for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i);// 删除法调整成小根堆for (int i = n - 1; i > 0; i--) {SortUtil.swap(arr, i, 0);// 注意第二个参数是 i 不是 nheapify(arr, i, 0);}return arr;}private static void heapify(int[] arr, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] > arr[largest]) largest = left;if (right < n && arr[right] > arr[largest]) largest = right;if (largest != i) {SortUtil.swap(arr, i, largest);heapify(arr, n, largest);}}}

8. 计数排序(Counting Sort)

非比较排序算法,适用于一定范围内的整数排序,它通过统计每个元素的个数来实现排序。

public class CountingSort {public static int[] sort(int[] arr) {int max = Arrays.stream(arr).max().getAsInt();int min = Arrays.stream(arr).min().getAsInt();int range = max - min + 1;int[] count = new int[range];for (int i : arr) count[i - min]++;int j = 0;for (int i = 0; i < range; i++) {while (count[i]-- > 0) arr[j++] = i + min;}return arr;}
}

9. 桶排序(Bucket Sort)

计数排序的改进

public class BucketSort {public static int[] sort(int[] arr) {// Step 1: 确定桶的数量和范围int maxValue = Arrays.stream(arr).max().getAsInt();int minValue = Arrays.stream(arr).min().getAsInt();int range = (maxValue - minValue) / arr.length + 1; // 桶的范围int bucketSize = (maxValue - minValue) / range + 1; // 桶的数量// Step 2: 创建桶并分配元素List<List<Integer>> buckets = new ArrayList<>();for (int i = 0; i < bucketSize; i++) buckets.add(new ArrayList<>());for (int num : arr) {int bucketIndex = (num - minValue) / range;buckets.get(bucketIndex).add(num);}// Step 3: 对每个桶中的元素进行排序(这里使用了Java内置的排序方法)for (List<Integer> bucket : buckets) Collections.sort(bucket);// Step 4: 合并各个桶中的元素int index = 0;for (List<Integer> bucket : buckets) {for (int num : bucket) {arr[index++] = num;}}return arr;}
}

这篇关于八大排序(Java实现)+ 桶排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006344

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque