八大排序(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

相关文章

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri