归并排序:
之前使用LinkedList作为承载,现在使用Object[]来作为承载。
package com.xiva.demo.sort; import java.util.Arrays; public class SortPractice<E extends Comparable<E>> { @SuppressWarnings("unchecked") public void merge(E[] array, int low, int high) { int mid = (high + low) / 2; int s1 = low; int s2 = mid + 1; System.out.println("len:" + (high - low)); Object[] tempArr = new Object[high - low + 1]; int tempIdx = 0; while (s1 <= mid && s2 <= high) { if (array[s1].compareTo(array[s2]) <= 0) { tempArr[tempIdx] = array[s1++]; tempIdx++; } else { tempArr[tempIdx] = array[s2++]; tempIdx++; } } if (s1 <= mid) { for (int i = s1; i <= mid; i++) { tempArr[tempIdx] = array[i]; tempIdx++; } } if (s2 <= high) { for (int i = s2; i <= high; i++) { tempArr[tempIdx] = array[i]; tempIdx++; } } System.out.println(Arrays.toString(tempArr) + low + ":" + high); for (int i = 0; i < tempArr.length; i++) { array[low + i] = (E) tempArr[i]; } } public void mergeSort(E[] array, int low, int high) { if (low < high) { mergeSort(array, low, (high + low) / 2); mergeSort(array, (high + low) / 2 + 1, high); merge(array, low, high); } } public static void main(String[] args) { SortPractice<Integer> sort = new SortPractice<Integer>(); Integer num01 = new Integer(12); Integer num02 = new Integer(13); Integer num03 = new Integer(44); Integer num04 = new Integer(3); Integer num05 = new Integer(13); Integer num06 = new Integer(5); Integer num07 = new Integer(7); Integer[] array = { num01, num02, num03, num04, num05, num06, num07, num04 }; sort.mergeSort(array, 0, array.length - 1); System.out.println(Arrays.toString(array)); } }
相关推荐
归并排序稳定性好,适合处理大数据量,但需要额外的存储空间。 6. 堆排序(Heap Sort) 堆排序是一种树形选择排序,是对直接选择排序的有效改进。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的...
在实际编程中,C语言因其简洁性和通用性,常被用于实现这些排序算法。了解并熟练掌握这些排序算法及其C语言实现,对于提升编程技能和解决实际问题具有很大帮助。在具体应用时,可以根据数据特性和性能需求选择合适的...
3. **Merge Sort(归并排序)**:归并排序是一种分治策略,它将大问题分解成小问题解决。在Java中,Merge Sort通过递归地将数组分为两半,分别排序后再合并,保证了稳定的排序效果,适用于处理大规模数据。 4. **...
这八种排序算法包括:堆排序、栈排序、归并排序、冒泡排序、比较排序、插入排序、快速排序以及希尔排序。下面将分别介绍这些排序算法的基本原理和特点,并探讨它们在实际应用中的优缺点。 1. 堆排序: 堆排序是一种...
接下来是归并排序,它采用分治策略,将大问题分解成小问题解决,再合并结果。归并排序的时间复杂度为O(n log n),空间复杂度为O(n),适合处理大数据集。 快速排序是另一种高效的排序算法,由C.A.R. Hoare提出,其...
5. **归并排序**:也是基于分治法,将数组分成两半,分别进行排序,再将两个有序部分合并。时间复杂度稳定为O(n log n)。 6. **堆排序**:利用堆这种数据结构,构建一个大顶堆或小顶堆,然后将堆顶元素与末尾元素...
为了提高效率,还可以考虑使用STL(Standard Template Library)中的`std::sort()`函数,它是一个通用排序算法,底层一般实现为快速排序或归并排序。使用STL可以简化代码,提高可读性,但理解基础排序算法原理仍然至...
归并排序是采用分治法的一个典型应用。将大问题分解为小问题来解决,将原始数组分为两个或更多个子数组,对每个子数组进行排序,然后将结果合并为一个有序的数组。 在代码实现中,可以看到创建了一个名为`Sort`的类...
根据给定的文件信息,我们可以深入探讨冒泡排序算法及其在C++中...通过分析和理解冒泡排序的C++实现,不仅可以加深对排序算法的理解,还能掌握如何在C++中利用模板类和成员函数来封装算法,提高代码的复用性和通用性。
6. **归并排序**:也是分治策略的一种,将序列不断分成两半,分别排序后合并,保证了排序的稳定性,但需要额外的存储空间。 7. **堆排序**:基于完全二叉树的堆数据结构,通过构建和调整堆来实现排序。堆排序在原地...
通过修改比较函数,可以适应不同数据类型,提高代码的通用性。例如,可以处理整数、浮点数甚至自定义对象的排序。 在实际开发中,了解这些基本排序算法的原理和性能至关重要,因为它们可以帮助我们选择最适合特定...
- **归并排序**:也是分治法,将数组拆分成两半,分别排序后合并,稳定性好。 - **堆排序**:基于完全二叉树的排序算法,通过构造最大堆或最小堆实现。 - **计数排序**:非基于比较的排序,适合整数排序,统计每...
4. **归并排序**:采用分治法,将大问题分解为小问题解决。将数组分成两半,分别排序,然后合并。在Java中,通常使用递归实现。 5. **基数排序**:非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,...
为了改进算法,可以考虑比较其他经典的排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序或堆排序,学习它们的优点并尝试融合到自己的实现中。此外,理解并优化递归过程,避免不必要的计算和重复工作,...
- 对于大型数据集,可以考虑使用更高效的排序算法,如快速排序、归并排序等。 - 可以增加对空值的处理逻辑,例如默认将其视为最小值或最大值,或者直接忽略。 - 考虑使用泛型来提高代码的通用性,以便支持不同...
4. **归并类排序**:如2-路归并排序,它通过将较小的子序列合并到一起,最终形成一个完整的有序序列。 **稳定性**是衡量排序算法的一个关键特性。如果排序算法能保持相等元素的相对顺序不变,那么该算法就是**稳定...
在上述代码中,`Vector::sort`函数是一个通用的排序入口,它通过一个随机数来决定使用哪种排序算法,包括起泡排序、选择排序、归并排序、堆排序和快速排序。其中,`bubbleSort`是专门用于实现起泡排序的函数。 起泡...
传统算法中特征点选取往往存在计算耗时和通用性差的问题,这限制了算法在实时性要求较高的场景下的应用。为了突破这一瓶颈,本文提出了一种基于FPGA的KLT特征点选取IP核的设计方法。 KLT算法中的最优特征点通常指的...
排序是数据处理的重要组成部分,包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等多种方法。冒泡和选择排序虽然简单,但效率较低;插入排序适用于部分有序的数据;快速排序是平均性能最好的内部排序...
课程还介绍了如何使用C#中的模板(泛型)来编写通用的排序算法,以及如何生成随机测试用例以验证算法的正确性。此外,插入排序法被详细讲解,包括其基本原理和改进方法。插入排序的时间复杂度为O(n^2),但其简单性和...