首先介绍归并和插入的算法思想,其实现细节可以参考博客http://java--hhf.iteye.com/blog/2034925/,然后再具体实现本文主要介绍的“大范围归并小范围插入排序”
(一)插入排序
算法执行思路如图
实现算法:
(二)归并排序(分治法)
先将源数据分成一个一个的小组,然后两两合并即是
合并两个数据的实现思路:(将L,R合并为A返回)
时间复杂度
(三)
/** * 先插入排序再归并 * 时间复杂度 nk+nlg(kn) * @author HHF * 2014年11月24日 */ public class MergeInsert { private static final int k = 1000; public static void main(String[] args) { int[] array = Common.random(0,10000,1000); System.out.print("原始数据:"); Common.printIntoTxt(array); sort(array1, 0, array1.length-1);; System.out.print("结果数据:"); Common.printIntoTxt(array); } public static void sort(int[] array, int start, int end) { if(start+k < end){//已经递归到了最后 每个集合里面自由一个元素 int middle = (end+start)/2; sort(array, start, middle); sort(array, middle+1, end); merge(array, start, middle, end); }else{ insert(array, start, end); } } /** * 插入排序 * @param array * @param end * @param start */ public static void insert(int[] array, int start, int end){ //从第二个开始 往上找下标比它小的数进行比较 int size = end-start+1; for(int i=1; i<size; i++){ for(int j=i-1; j>=0; j--){ if(array[start+j+1]<array[start+j]){//找到了i的正确位置 为j+1 Common.swap(array, start+j+1, start+j); } } //Common.print(array); } } /** * 将两个数组合并 * @param array * @param array2 * @return 是否成功合并 */ private static Boolean merge(int[] array, int start, int middle, int end) { int size1 = middle - start + 1;//[start, middle] int size2 = end - middle;//(middle, end] int[] array1 = new int[size1]; int[] array2 = new int[size2]; int i=0, j=0, k=start; while(i<size1){//获取到array数组左边的值 array1[i] = array[start+i]; i++; } while(j<size2){//获取到array数组右边的值 array2[j] = array[middle+1+j]; j++; } i=j=0; while(i<size1 && j<size2){//将两者中数据插入到新的数组中去 if(array1[i]<array2[j]){ array[k++] = array1[i]; i++; }else{ array[k++] = array2[j]; j++; } } //收拾还剩余的数据 if(i<size1){ while(i<size1){ array[k++] = array1[i]; i++; } } if(j<size2){ while(j<size2){ array[k++] = array2[j]; j++; } } array1 = null; array2 = null; if(k == end+1){ return true; }else{ return false; } } }
(四)内排序下界
堆排序具体实现可以参考博客http://java--hhf.iteye.com/blog/2034925/
(ps:附件内附上工具类Common.zip)
相关推荐
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
本项目涵盖了五种经典的排序算法:快速排序、堆排序、归并排序、插入排序和选择排序。接下来,我们将深入探讨这些算法的原理、实现及性能特点。 1. **快速排序**: 快速排序由C.A.R. Hoare在1960年提出,是一种采用...
选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法
归并排序是一种基于分治思想的排序算法,而插入排序则是一种简单直观的排序算法,适用于小规模或部分有序的数据。 **归并排序**: 1. **基本原理**:归并排序将待排序的序列分为两半,对每一半递归地进行归并排序,...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
在实际应用中,应根据数据特性选择合适的排序算法,例如,快速排序和二路归并排序在大多数情况下效率较高,而冒泡排序和直接插入排序则适用于小规模数据或部分有序数据。在学习这些算法时,不仅要关注代码实现,更要...
在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...
以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...
本资源包含了几种常见的排序算法,包括堆排序、选择排序、冒泡排序、归并排序和插入排序。这些排序算法各有特点,适用于不同的场景,并且在理解它们的工作原理后,能够帮助初学者更好地掌握编程基础。 1. **堆排序*...
这里我们将深入探讨两种常见的排序算法:插入排序(Insertion Sort)和归并排序(Merge Sort),它们都是在Java环境下实现的。 **插入排序**是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序...
例如,对于小规模数据或部分有序的数据,插入排序和冒泡排序可能是好的选择;而对于大规模无序数据,快速排序和归并排序更高效;而基数排序则在处理大量整数排序时表现出色。理解并熟练掌握这些排序算法,对提升编程...
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht
下面将详细讲解这7种排序算法:快速排序、归并排序、插入排序、选择排序、冒泡排序、堆排序以及希尔排序。 1. **快速排序**:由C.A.R. Hoare提出的,采用分治策略。基本思想是选取一个基准元素,通过一趟排序将待...
插入排序、冒泡排序、归并排序、快速排序四种排序方式的C++实现,各写成了一个函数,主函数中可以选择调用那一个。初始化数组时用的是随机种子srand((int)time(0))。在宏中定义数组大小。
- 归并排序是建立在归并操作上的一种有效的排序算法,它采用了分治的策略,将大问题分解为小问题来解决。 - C++实现归并排序时,首先将数组分为两半,分别对左右两部分进行排序,然后将两个已排序的子数组合并为一...
- 堆排序利用了堆这种数据结构,先将待排序序列构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,调整剩下的元素重新构造成堆,直到整个序列有序。 - C# 实现堆排序时,主要涉及建堆、交换堆顶和调整堆的...
这里我们主要探讨五种排序算法:直接插入排序、堆排序、归并排序和快速排序,它们都是针对字符串元素进行排序的。这四种算法在C语言中都有实现,并且适用于随机生成的长度在1到16之间的字符串。 1. 直接插入排序: ...
实际测试表明,对大规模数据(如 1000 万或 1 亿)进行排序时,优化后的归并排序(包括插入排序优化和内存分配策略优化)显著优于原始版本。内存分配策略的优化对于减少运行时间的影响尤为明显,特别是在处理亿级...
采用c++描述了各种排序算法,包括选择排序 冒泡排序 插入排序 基数排序 快速排序 归并排序 。实验内容 1、创建排序类。 2、提供操作:选择排序、冒泡排序、插入排序、*基数排序、*快速排序、*归并排序。 3、*能够...