插入排序
来源:互联网 发布:国牌lolita淘宝店铺 编辑:程序博客网 时间:2024/06/01 10:36
基本概念:
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,
算法分析:
依次将每个记录插入到一个有序中去。就是说,第i遍整理时,A1,A2,...,Ai-1已经是排好序的子序列;取出第i个元素Ai,在已排好序的子序列为Ai找到一个合适的位置,并将它插到该位置上。易知上述排序当i=1时实际上为空操作,故可直接从i=2开始。
复杂度分析:
空间效率:仅用了一个辅助单元。最差复杂度:当输入数组为倒序时,复杂度为O(n^2) 最优复杂度:当输入数组就是排好序的时候,复杂度为O(n) 直接插入排序的时间复杂度为O(n2)。是一个稳定的排序方法。 插入排序比较适合用于“少量元素的数组”。
#include<bits/stdc++.h>using namespace std;int d(int a[],int x,int num) //查找数num在长度为x的a数组中的插入位置{ int l=1,r=x,mid=0; while(l<=r) { mid=(l+r)/2; if(a[mid]>num) r=mid-1; else l=mid+1; } if(a[mid]<=num) mid++; return mid;}void f(int a[],int n){ int i,j,temp; for(i=2; i<=n; i++) //从第2个数开始插入 { int mid=d(a,i,a[i]); if(i!=mid) //插入位置不为i,才插入 { j=i; temp=a[i]; while(j>mid) { a[j]=a[j-1]; j--; } a[j]=temp; } }}int main(){ int n,a[100010],i; scanf("%d",&n); for(i=1; i<=n; i++) scanf("%d",&a[i]); f(a,n); for(i=1; i<=n; i++) printf("%d ",a[i]); return 0;}
阅读全文
0 0
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 懒人读算法(四)-寻找最大连续值
- Ubuntu 16.04 安装 PyCharm-Python IDE
- 正则表达式(习题)
- 线形对象与平面相交
- 第四周 循环双链表应用
- 插入排序
- Linux ALSA声卡驱动之三:PCM设备的创建
- sql问题总结
- android常用框架集合
- 并行计算学习计划
- Fields in a "Serializable" class should either be transient or serializable序列化
- 职场,最需要的是主动
- java---反射机制
- iOS实战演练之通过命令行将iOS的APP安装到模拟器中