浅谈2路插入排序算法及其简单实现

2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间。

难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好的理解辅助空间中最大值和最小值的位置了。

算法整体思想还是很简单的,直接贴出可运行代码,注释还是挺清楚的,大家直接看就ok了

C语言实现示例

  #include <stdio.h>
  #include <stdlib.h> 

  void insert_sort(int *arr, int *temp, int n)
  {
    int i, first, final, k; 

    first = final = 0;
    temp[0] = arr[0]; 

    for (i = 1; i < n; i ++) {
      if (arr[i] < temp[first]) { // 待插入元素比最小的元素小
        first = (first - 1 + n) % n;
        temp[first] = arr[i];
      } else if (arr[i] > temp[final]) { // 待插入元素比最大元素大
        final = (final + 1 + n) % n;
        temp[final] = arr[i];
      } else { // 插入元素比最小大,比最大小
        k = (final + 1 + n) % n;
        while (temp[((k - 1) + n) % n] > arr[i]) {
          temp[(k + n) % n] =temp[(k - 1 + n) % n];
          k = (k - 1 + n) % n;
        }
        temp[(k + n) % n] = arr[i];
        final = (fianl + 1 + n) % n;
      }
    } 

    // 将排序记录复制到原来的顺序表里
    for (k = 0; k < n; k ++) {
      arr[k] = temp[(first + k) % n];
    }
  } 

  int main(void)
  {
    int i, n, *arr, *temp; 

    while (scanf("%d", &n) != EOF) {
      arr = (int *)malloc(sizeof(arr) * n);
      temp = (int *)malloc(sizeof(temp) * n); 

      for (i = 0; i < n; i ++)
        scanf("%d", &arr[i]); 

      insert_sort(arr, temp, n); 

      for (i = 0; i < n; i ++)
        printf("%d ", arr[i]);
      printf("\n");
      free(arr);
      free(temp);
    } 

    return 0;
  }

同时附上C++写法:

#include<iostream>
using namespace std;
#define MAX 20
void PrintArray(int a[],int len){
 for(int i=0;i<len;i++)
 cout<<a[i]<<" ";
 cout<<endl;
}
void BinInsertSort(int a[],int len){
 int *d=(int *)malloc(len*sizeof(len));
 for(int i=0;i<len;i++)
 d[i]=0;
 int first=0,final=0;
 d[0]=a[0];
 for(int i=1;i<len;i++){
 if(a[i]<=d[first]){
  first=(first-1+len)%len;
  d[first]=a[i];
 }
 else if(a[i]>=d[final]){
  final=final+1;
  d[final]=a[i];
 }
 else{
  int j=final++;
  while(a[i]<d[j]){
  d[(j+1)%len]=d[j];
  j=(j-1+len)%len;
  }
  d[j+1]=a[i];
 }
 }
 cout<<"辅助数组中排序结果为:";
 PrintArray(d,len);
}
int main(){
 int a[MAX],len;
 cout<<"请输入待排序的元素个数:";
 cin>>len;
 cout<<"请输入待排序的元素:";
 for(int i=0;i<len;i++)
 cin>>a[i];
 BinInsertSort(a,len);
 system("pause");
 return 0;
}
(0)

相关推荐

  • 浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好的理解辅助空间中最大值和最小值的位置了. 算法整体思想还是很简单的,直接贴出可运行代码,注释还是挺清楚的,大家直接看就ok了 C语言实现示例 #include <stdio.h> #include <stdlib.h> void insert_sort(int *arr, int *t

  • 浅谈线性表的原理及简单实现方法

    一.线性表 原理:零个或多个同类数据元素的有限序列 原理图: 特点 : 1.有序性 2.有限性 3.同类型元素 4.第一个元素无前驱,最后一个元素无后继,中间的元素有一个前驱并且有一个后继 线性表是一种逻辑上的数据结构,在物理上一般有两种实现 顺序实现和链表实现 二.基于数组的 线性表顺序实现 原理 : 用一段地址连续的存储单元依次存储线性表数据元素. 原理图: 算法原理: 1.初始化一个定长的数组空间 elementData[] , size 存储长度 存储元素 2.通过索引来快速存取元素 3

  • 浅谈Java实现回溯算法之八皇后问题

    目录 一.前言 二.浅谈递归 三.回溯算法 四.八皇后问题 五.八皇后变种 六.总结 一.前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 二.浅谈递归 对于递归算法,我觉得掌握递归是入门数据结构与算法的关键,因为后面学习很多操作涉及到递归,例如链表的一些操作.树的遍历和一些操作.图的dfs.快排.归并排序等等. 递归的实质还是借助栈实现一些操作,利用递归能够完成的操作使用栈都能够完成,并且利用栈的话可以很好的控制停止,效率

  • 浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头

    在使用pyplot画图的时候,有时会需要在图上标注一些文字,如果曲线靠的比较近,最好还能用箭头指出标注文字和曲线的对应关系.这里就介绍文字标注和箭头的使用. 添加标注使用pyplot.text,由pyplot或者subplot调用.下面是可以选择的参数, text(tx,ty,fontsize=fs,verticalalignment=va,horizontalalignment=ha,...) 其中,tx和ty指定放置文字的位置,va和ha指定对其方式,可以是top,bottom,center

  • 浅谈java中BigDecimal类的简单用法

    一.BigDecimal概述 ​ Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理.一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度.所以开发中,如果我们需要精确计算的结果,则必须使用

  • 浅谈OAuth 2.0 的一个简单解释

    这个标准比较抽象,使用了很多术语,初学者不容易理解.其实说起来并不复杂,下面我就通过一个简单的类比,帮助大家轻松理解,OAuth 2.0 到底是什么. 一.快递员问题 我住在一个大型的居民小区. 小区有门禁系统. 进入的时候需要输入密码. 我经常网购和外卖,每天都有快递员来送货.我必须找到一个办法,让快递员通过门禁系统,进入小区. 如果我把自己的密码,告诉快递员,他就拥有了与我同样的权限,这样好像不太合适.万一我想取消他进入小区的权力,也很麻烦,我自己的密码也得跟着改了,还得通知其他的快递员.

  • 浅谈python常用程序算法

    一.冒泡排序: 1.冒泡排序是将无序的数字排列成从小到大的有序组合: 过程:对相邻的两个元素进行比较,对不符合要求的数据进行交换,最后达到数据有序的过程. 规律: 1.冒泡排序的趟数时固定的:n-1 2.冒泡排序比较的次数时固定的:n*(n-1)/2 3.冒泡排序交换的次数时不固定的:但是最大值为:n*(n-1)/2 注意:n = 数据个数,排序过程中需要临时变量存储要交换的数据 eg: l=[688, 888, 711,999,1,4,6] for i in range(len(l)-1):

  • Python中使用插入排序算法的简单分析与代码示例

    问题描述 将一组随机排列的数字重新按照从小到大的顺序排列. 插入算法 每次从数组中取一个数字,与现有数字比较并插入适当位置. 如此重复,每次均可以保持现有数字按照顺序排列,直到数字取完,即排序成功. 这很像打牌时的抓牌情况, 第一个条件:保持手上的牌的顺序是正确的 第二个条件:每次抓到新的牌均按照顺序插入手上的牌中间. 保证这两条不变,那么无论抓了几张牌,最后手上的牌都是依照顺序排列的. Python 实现: def insertion_sort(n): if len(n) == 1: retu

  • 浅谈Android单元测试的作用以及简单示例

    前提概要 受人嫌弃的单元测试 对于单元测试这个知识点,其实很多开发者是不太接触的,包括笔者,在实习之前也并未实用过单元测试,或者说并没感受到单元测试的好处. 对于bug的调试,笔者之前更倾向于使用log和断点调试,可以说会了这两个,大部分的逻辑bug都能自己解决了.这两个与看似臃肿的单元测试代码相比更受大家的喜爱. 但是,使用log和断点调试的前提是开发人员较少,甚至是单人开发的情况.如果我自己开发,我完全可以每次都使用集成测试,我知道每一个功能会涉及哪些模块的代码,然后根据逻辑设置log或者断

  • 浅谈android组件化之ARouter简单使用

    ARouter是阿里巴巴开源出来的一款android路由框架,github地址为 : https://github.com/alibaba/ARouter 至于ARouter的诸多好处我就不介绍了,这里主要讲解在项目组件化下,ARouter的一些简单使用 先贴上工程目录: 工程一共分为4个模块,基础组件app.基础服务(包涵路由服务)basecommonlibrary模块.业务模块libraryone.业务模块librarytwo; 在4个模块的gradle文件当中加入如下代码: android

随机推荐