插入排序

来源:互联网 发布:国牌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;}
原创粉丝点击