第二章之“合并排序中对小数组采用插入排序”(思考题2-1)
2011-12-27 13:58
337 查看
虽然插入排序的时间复杂度为O(n^2),合并排序的时间复杂度为O(nlgn),但是当子问题规模很小时,插入排序的效率要比合并排序高,所以,可以将合并排序和插入排序进行组合,当合并排序的子数组小到一定程度时,不再进行划分,而是改变算法,用插入排序算法对其进行排序。
#include <stdio.h> #include <string.h> #include <time.h> #define BUFFER_SIZE 10 int InsertionSort(int *a,int p,int q) { int i=0; int j=0; int b[q-p+1]; memset(b,0,sizeof(b)); b[0]=a[p]; for(i=p+1;i<=q;i++) { j=i-p-1; while(j>=0&&b[j]>=a[i]) { b[j+1]=b[j]; j--; } b[j+1]=a[i]; } for(i=p,j=0;i<=q;i++) { a[i]=b[j]; j++; } } void Merge(int *a,int p,int q,int r) { int n1=q-p+1; int n2=r-q; int i=0; int j=0; int k=0; int b[n1+1]; int c[n2+1]; memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); b[n1]=BUFFER_SIZE;//设置哨兵元素,注意不要溢出 c[n2]=BUFFER_SIZE;//设置哨兵元素,注意不要溢出 for(i=0;i<n1;i++) { b[i]=a[p+i]; } for(i=0;i<n2;i++) { c[i]=a[q+1+i]; } for(i=p,j=0,k=0;i<=r;i++) { if(b[j]<=c[k]) { a[i]=b[j]; j++; } else { a[i]=c[k]; k++; } } } void MergeAndInsertionSort(int *a,int p,int r,int k) { int q=0; if(p>=r) { return; } q=(p+r)/2; if((q-p+1)<=k)//子数组长度≤k的时候就不再进行划分,而是对该子数组进行插入排序 { InsertionSort(a,p,q); } else { MergeAndInsertionSort(a,p,q,k); } if(r-q<=k) { InsertionSort(a,q+1,r); } else { MergeAndInsertionSort(a,q+1,r,k); } Merge(a,p,q,r); } void Output(int *a,int len) { int i=0; for(i=0;i<len;i++) { printf("%d ",a[i]); } printf("\n"); } int main() { int i=0; int k=1; int a[BUFFER_SIZE]; memset(a,0,sizeof(a)); srand((unsigned)time(NULL)); for(i=0;i<BUFFER_SIZE;i++) { a[i]=rand()%BUFFER_SIZE; } printf("随机生成的数组:"); Output(a,BUFFER_SIZE); k=rand()%BUFFER_SIZE+1; printf("k=%d\n",k); MergeAndInsertionSort(a,0,BUFFER_SIZE-1,k); printf("排序后的数组:"); Output(a,BUFFER_SIZE); system("pause"); return 0; }
相关文章推荐
- LintCode 合并排序数组 II
- 编程分别输入两个按从小到大排序的数组a和b,将这两个有序数组合并,使合并后的数组仍有序 (从小到大)
- 9.11排序与查找(一)——给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序
- 基于php实现随机合并数组并排序(原排序)
- lintcode ----合并排序数组
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- 最坏情况下,合并两个大小为n的已排序数组所需要的比较次数
- LintCode-合并排序数组 II
- 排序数组合并
- LeetCode-88:Merge Sorted Array (合并两排序数组)
- 实现两有序数组的合并仍为新有序数组,且不对新数组排序的最简单方法
- lintcode-合并排序数组II-64
- c# 合并数组后排序输出
- 多维数组排序及数组合并
- 排序13:有序数组合并
- [排序数组合并]
- Lintcode 合并排序数组 II
- 6.用插入排序对任意一组随机数据进行随机数组进行排序(用循环和递归两种方法)
- Java将两排序数组合并
- 数组合并+数组去重+数组排序