浅谈2路插入排序算法及其简单实现
2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间。
难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好的理解辅助空间中最大值和最小值的位置了。
算法整体思想还是很简单的,直接贴出可运行代码,注释还是挺清楚的,大家直接看就ok了
C语言实现示例
#include<stdio.h> #include<stdlib.h> voidinsert_sort(int*arr,int*temp,intn) { inti,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]; }elseif(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]; } } intmain(void) { inti,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); } return0; }
同时附上C++写法:
#include<iostream> usingnamespacestd; #defineMAX20 voidPrintArray(inta[],intlen){ for(inti=0;i<len;i++) cout<<a[i]<<""; cout<<endl; } voidBinInsertSort(inta[],intlen){ int*d=(int*)malloc(len*sizeof(len)); for(inti=0;i<len;i++) d[i]=0; intfirst=0,final=0; d[0]=a[0]; for(inti=1;i<len;i++){ if(a[i]<=d[first]){ first=(first-1+len)%len; d[first]=a[i]; } elseif(a[i]>=d[final]){ final=final+1; d[final]=a[i]; } else{ intj=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); } intmain(){ inta[MAX],len; cout<<"请输入待排序的元素个数:"; cin>>len; cout<<"请输入待排序的元素:"; for(inti=0;i<len;i++) cin>>a[i]; BinInsertSort(a,len); system("pause"); return0; }