插入排序

来源:互联网 发布:清华java培训 编辑:程序博客网 时间:2024/05/16 07:22

基本思想:

将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。

#include <cstdio>#include <cstring>using namespace std;int main(){    int a[100];    int n;    scanf("%d",&n);    for(int i=0; i<n; i++)        scanf("%d",&a[i]);    for(int i=1; i<n; i++)    {        if(a[i]<a[i-1])//若后面比前面大,则直接插入,否则移动有序表后插入        {            int j=i-1;            int x=a[i];//复制哨兵,存储待排序元素            a[i]=a[i-1];//先后移动一个位置            while(x<a[j])//查找有序表中的插入位置            {                a[j+1]=a[j];                j--;            }            a[j+1]=x;//插入到正确位置        }    }    for(int i=0; i<n; i++)        printf("%d ",a[i]);    printf("\n");    return 0;}

希尔排序,插入排序的压缩版本
基本思想:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

操作方法:

选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列个数k,对序列进行k 趟排序;
每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

#include <cstdio>#include <cstring>using namespace std;int shellsort(int a[],int n,int d){    for(int i=d; i<n; i++)    {        if(a[i]<a[i-d])//若后面比前面大,则直接插入,否则移动到第d个有序表后插入        {            int j=i-d;            int x=a[i];//复制哨兵,存储待排序元素            a[i]=a[i-d];//先后移动d个位置            while(x<a[j])//查找有序表中的插入位置            {                a[j+d]=a[j];                j-=d;            }            a[j+d]=x;//插入到正确位置        }    }}int shelldex(int a[],int n){    int d=n/2;    while(d>=1)    {        shellsort(a,n,d);        d/=2;    }}int main(){    int a[100];    int n;    scanf("%d",&n);    for(int i=0; i<n; i++)        scanf("%d",&a[i]);    shelldex(a,n);    for(int i=0; i<n; i++)        printf("%d ",a[i]);    printf("\n");    return 0;}
0 0
原创粉丝点击