使用java实现并归排序算法

时间: 2023-08-04 16:14:53 浏览: 19
好的,下面是Java实现归并排序的代码: ``` public class MergeSort { public static void mergeSort(int[] arr, int start, int end) { if (start < end) { int mid = (start + end) / 2; mergeSort(arr, start, mid); mergeSort(arr, mid + 1, end); merge(arr, start, mid, end); } } public static void merge(int[] arr, int start, int mid, int end) { int[] temp = new int[arr.length]; int i = start, j = mid + 1, k = start; while (i <= mid && j <= end) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= end) { temp[k++] = arr[j++]; } for (i = start; i <= end; i++) { arr[i] = temp[i]; } } public static void main(String[] args) { int[] arr = {9, 7, 2, 8, 3, 6, 5, 1, 4}; mergeSort(arr, 0, arr.length - 1); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } } ``` 以上代码实现了归并排序算法,使用了递归的思想,将数组不断分割成更小的部分,然后再将它们合并起来。

相关推荐

Java 中常见的排序算法包括: 1. 冒泡排序(Bubble Sort) 2. 选择排序(Selection Sort) 3. 插入排序(Insertion Sort) 4. 希尔排序(Shell Sort) 5. 归并排序(Merge Sort) 6. 快速排序(Quick Sort) 7. 堆排序(Heap Sort) 8. 计数排序(Counting Sort) 9. 桶排序(Bucket Sort) 10. 基数排序(Radix Sort) 这里简单介绍一下冒泡排序和快速排序的实现。 1. 冒泡排序 冒泡排序的基本思想是:比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。重复这个过程,直到没有任何一对数字需要比较。 Java 代码实现: java 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. 快速排序 快速排序是一种常用的排序算法,它的基本思想是:选择一个基准元素,将数组分成两部分,一部分比基准元素小,另一部分比基准元素大,然后对这两部分再分别进行排序。 Java 代码实现: java 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, j = right; while (i < j) { // 从右边扫描,找到第一个小于基准元素的位置 while (i < j && arr[j] >= pivot) { j--; } if (i < j) { arr[i++] = arr[j]; } // 从左边扫描,找到第一个大于基准元素的位置 while (i < j && arr[i] < pivot) { i++; } if (i < j) { arr[j--] = arr[i]; } } arr[i] = pivot; return i; // 返回分割点的位置 } 以上是两种常见的排序算法的 Java 实现。在实际应用中,我们需要根据数据量大小、数据分布情况等因素选择合适的排序算法。
好的,以下是 Java 实现快速排序算法的代码: java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } public static int partition(int[] arr, int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; } public static void main(String[] args) { int[] arr = { 10, 7, 8, 9, 1, 5 }; int n = arr.length; quickSort(arr, 0, n - 1); System.out.println(Arrays.toString(arr)); } } 在这个实现中,我们使用递归的方式来实现快速排序算法。我们首先选择一个元素作为枢轴元素(在这个实现中,我们选择最后一个元素作为枢轴元素),并将数组分为两个子数组:小于枢轴元素的元素和大于枢轴元素的元素。 然后,我们递归地对两个子数组进行快速排序,直到整个数组被排序。在每个递归步骤中,我们使用 partition() 方法来分割数组,并返回枢轴元素的索引。 在 partition() 方法中,我们使用了两个指针来遍历数组,i 用于追踪小于枢轴元素的元素的位置,j 用于迭代数组。如果 arr[j] 小于枢轴元素,则将 arr[j] 和 arr[i] 交换位置,并将 i 增加 1。 最后,我们将枢轴元素与 arr[i+1] 交换位置,以便将枢轴元素放到正确的位置上。这样,我们就完成了一次分割操作。
快速排序是一种常用的排序算法,其基本思想是将一个待排序的序列分成两个子序列,然后对这两个子序列分别进行排序,以达到整个序列有序的目的。 以下是Java实现快速排序算法的代码: public class QuickSort { public static void quickSort(int[] arr, int left, int right) { if (left < right) { int partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex - 1); quickSort(arr, partitionIndex + 1, right); } } public 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--; } } int temp = arr[left]; arr[left] = arr[j]; arr[j] = temp; return j; } public static void main(String[] args) { int[] arr = {5, 3, 8, 4, 2}; quickSort(arr, 0, arr.length - 1); for (int i : arr) { System.out.print(i + " "); } } } 在该代码中,quickSort方法用于进行快速排序,其中left表示待排序序列的左边界,right表示待排序序列的右边界。首先判断左边界是否小于右边界,如果是,则进行分区操作,分别对左分区和右分区进行递归调用。 partition方法用于进行分区操作,其中pivot表示基准值,即待排序序列的第一个元素。i和j分别表示左侧指针和右侧指针,初始时i=left+1,j=right。在while循环中,左侧指针向右移动,直到找到一个大于等于pivot的元素,右侧指针向左移动,直到找到一个小于等于pivot的元素,然后交换这两个元素的位置。最后将基准值和右侧指针所指的元素交换位置,并返回右侧指针的位置。 在main方法中,定义一个待排序的整型数组,然后调用quickSort方法进行排序,并输出排序后的结果。 该代码的时间复杂度为O(nlogn),空间复杂度为O(logn)。
在Java中,可以通过直接插入排序、希尔排序和堆排序来实现排序算法。 直接插入排序的Java实现可以参考以下代码: java import java.util.Arrays; public class InsertSortDemo { public static void insertSort(int[] arr) { for (int i = 1; i < arr.length; 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; } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); insertSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } 希尔排序的Java实现可以参考以下代码: java import java.util.Arrays; public class ShellSortDemo { public static void shellSort(int[] arr) { int n = arr.length; for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int key = arr[i]; int j = i; while (j >= gap && arr[j - gap > key) { arr[j = arr[j - gap]; j -= gap; } arr[j = key; } } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); shellSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } 堆排序的Java实现可以参考以下代码: java import java.util.Arrays; public class HeapSortDemo { public static void heapSort(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--) { int temp = arr = arr[i]; arr[i = temp; heapify(arr, i, 0); } } public 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) { int temp = arr[i]; arr[i = arr[largest]; arr[largest = temp; heapify(arr, n, largest); } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); heapSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } 以上是三种常见排序算法的Java实现。123 #### 引用[.reference_title] - *1* *2* *3* [java实现七种经典排序算法](https://blog.csdn.net/qq_27498287/article/details/126049089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

最新推荐

IT面试笔试-各种排序算法Java实现

IT常见的面试题目,各种排序算法的Java代码实现,内部有代码和详细的注释信息。

java排序算法使用及场景说明

java排序算法使用及场景说明 文档后面有一些别人的链接,多在google上搜索Java排序算法,及维基百科上面也有很全的算法介绍。

Java Collections.sort()实现List排序的默认方法和自定义方法

主要介绍了Java Collections.sort()实现List排序的默认方法和自定义方法,需要的朋友可以参考下

java数据结构与算法.pdf

包含了各种数据结构和算法(java)的实现方式和详解(图解),包括单双链表、环形链表(约瑟夫问题)、栈、后缀表达式、中缀表达式转后缀表达式、迷宫问题、八大排序算法、多种查找算法、哈希表、二叉树实现以及操作...

Tomcat 相关面试题,看这篇!.docx

图文并茂吃透面试题,看完这个,吊打面试官,拿高薪offer!

基于51单片机的usb键盘设计与实现(1).doc

基于51单片机的usb键盘设计与实现(1).doc

"海洋环境知识提取与表示:专用导航应用体系结构建模"

对海洋环境知识提取和表示的贡献引用此版本:迪厄多娜·察查。对海洋环境知识提取和表示的贡献:提出了一个专门用于导航应用的体系结构。建模和模拟。西布列塔尼大学-布雷斯特,2014年。法语。NNT:2014BRES0118。电话:02148222HAL ID:电话:02148222https://theses.hal.science/tel-02148222提交日期:2019年HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire论文/西布列塔尼大学由布列塔尼欧洲大学盖章要获得标题西布列塔尼大学博士(博士)专业:计算机科学海洋科学博士学院对海洋环境知识的提取和表示的贡献体系结构的建议专用于应用程序导航。提交人迪厄多内·察察在联合研究单位编制(EA编号3634)海军学院

react中antd组件库里有个 rangepicker 我需要默认显示的当前月1号到最后一号的数据 要求选择不同月的时候 开始时间为一号 结束时间为选定的那个月的最后一号

你可以使用 RangePicker 的 defaultValue 属性来设置默认值。具体来说,你可以使用 moment.js 库来获取当前月份和最后一天的日期,然后将它们设置为 RangePicker 的 defaultValue。当用户选择不同的月份时,你可以在 onChange 回调中获取用户选择的月份,然后使用 moment.js 计算出该月份的第一天和最后一天,更新 RangePicker 的 value 属性。 以下是示例代码: ```jsx import { useState } from 'react'; import { DatePicker } from 'antd';

基于plc的楼宇恒压供水系统学位论文.doc

基于plc的楼宇恒压供水系统学位论文.doc

"用于对齐和识别的3D模型计算机视觉与模式识别"

表示用于对齐和识别的3D模型马蒂厄·奥布里引用此版本:马蒂厄·奥布里表示用于对齐和识别的3D模型计算机视觉与模式识别[cs.CV].巴黎高等师范学校,2015年。英语NNT:2015ENSU0006。电话:01160300v2HAL Id:tel-01160300https://theses.hal.science/tel-01160300v22018年4月11日提交HAL是一个多学科的开放获取档案馆,用于存放和传播科学研究文件,无论它们是否已这些文件可能来自法国或国外的教学和研究机构,或来自公共或私人研究中心。L’archive ouverte pluridisciplinaire博士之路博士之路博士之路在获得等级时,DOCTEURDE L'ÉCOLE NORMALE SUPERIEURE博士学校ED 386:巴黎中心数学科学Discipline ou spécialité:InformatiquePrésentée et soutenue par:马蒂厄·奥布里le8 may 2015滴度表示用于对齐和识别的Unité derechercheThèse dirigée par陪审团成员équipe WILLOW(CNRS/ENS/INRIA UMR 8548)慕尼黑工业大学(TU Munich�