排序算法汇总一------插入类算法

来源:互联网 发布:sql多张表合并 union 编辑:程序博客网 时间:2024/05/19 02:39

插入排序的基本思想:

在一个已经排好顺序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,直到将所有待排序记录全部插入为止。


直接插入算法:


思路:将第i个数直接插入到前面i-1个已经排好序的记录中,平均复杂度:o(n*n)

void InsSort(int *d,int length){    for(int i=1;i<length;i++)    {        int next=i-1;        int nowdata=d[i];        while(nowdata>d[next]&&next>=0)        {            d[next+1]=d[next];next--;        }        d[next+1]=nowdata;    }}


折半插入算法:

思路:与直接插入比,该算法利用折半查找,性能优于直接插入,平均复杂度:o(n*n)

void BinSort(int *d,int length){    for(int i=1;i<length;i++)    {        int nowdata=d[i];        int low=0,high=i-1;        while(low<=high)        {            int mid=(low+high)/2;            if(d[mid]>nowdata)            {                low=mid+1;            }            else            {                high=mid-1;            }        }        for(int j=i-1;j>=low;j--) d[j+1]=d[j];        d[low]=nowdata;    }}


希尔排序算法:

思路:又称为缩小增量排序法。是一种基于插入思想的排序算法,算法本身利用插入算法的最佳性质,分成若干个较小的子序列,对子序列进行排序。增量的选择采用[d/3]+1

void ShellSort(int *d,int length){    bool finish=false;    int dlt=length;    while(!finish)    {        dlt=dlt/3+1;        if(dlt==1) finish=true;        for(int i=dlt;i<length;i++)        {            int nowdata=d[i];            if(nowdata>d[i-dlt])            {                int j;                for(j=i-dlt;j>=0 && nowdata>d[j];j-=dlt){d[j+dlt]=d[j];}                d[j+dlt]=nowdata;            }        }    }    Print(d,length);}


总测试代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;int data[10]={0,5,6,9,8,7,5,3,5,1};//test datavoid Print(int *d,int length){    for(int i=0;i<length;i++)    {        printf("%d ",d[i]);    }    printf("\n\n\n");}void InsSort(int *d,int length){    for(int i=1;i<length;i++)    {        int next=i-1;        int nowdata=d[i];        while(nowdata>d[next]&&next>=0)        {            d[next+1]=d[next];next--;        }        d[next+1]=nowdata;    }    Print(d,length);}void BinSort(int *d,int length){    for(int i=1;i<length;i++)    {        int nowdata=d[i];        int low=0,high=i-1;        while(low<=high)        {            int mid=(low+high)/2;            if(d[mid]>nowdata)            {                low=mid+1;            }            else            {                high=mid-1;            }        }        for(int j=i-1;j>=low;j--) d[j+1]=d[j];        d[low]=nowdata;    }    Print(d,length);}void ShellSort(int *d,int length){    bool finish=false;    int dlt=length;    while(!finish)    {        dlt=dlt/3+1;        if(dlt==1) finish=true;        for(int i=dlt;i<length;i++)        {            int nowdata=d[i];            if(nowdata>d[i-dlt])            {                int j;                for(j=i-dlt;j>=0 && nowdata>d[j];j-=dlt){d[j+dlt]=d[j];}                d[j+dlt]=nowdata;            }        }    }    Print(d,length);}int main(){    ShellSort(data,10);    return 0;}

没写完,待续

0 0
原创粉丝点击