几种排序算法

//插入排序void sort(int a[],inta_size)

{

    int key,i,j;

    for(i=1;i<a_size;i++)

    {

       key=a[i];

       j=i-1;

       while(key<a[j])

       {

           a[j+1]=a[j];

           j--;

       }

       a[++j]=key;

    }

    printf("\n");

    print(a,a_size);

}

插入排序的设计思想就是按照从数组a[1]开始(当然也可以从0开始只不过从0开始会多加一个判断得不偿失),每次循环所要加入的元素,如果大于前一个元素,就直接加入,否则就将将前面已经排好序的数组向后推,一直推到前面的元素小于当前所要加入的元素,一直插入,直至整个数组结束。

 

 

//希尔排序void sort(int *a,intn)

{

    int key,j;

    int mid=n/2;

    while(mid>=1)

    {

       for(inti=mid+1;i<n;i++)

       {

           key=a[i];

           j=i-mid;

           while(key<a[j]&&j>=0)

           {

              a[j+mid]=a[j];

              j=j-mid;

           }

           a[j+mid]=key;

       }

       mid=mid/2;

    }

}

希尔排序的设计思想就是在插入排序的设计思想上不断的跳跃,避免了极端情况的发生(数组要大规模的向右移)。其本质和插入排序差不多。

 

 

 

 

//归并排序void sort(int *a,int*c,int start,intend)

{

    void merge(int *a,int *b,int start,int mid,int end);

    int b[20];

    while(end>start)

    {

       int mid=(end-start)/2;

       sort(a,b,start,mid);

       sort(a,b,mid+1,end);

       merge(a,b,start,mid,end);

    }

    if(end==start)

    {

       c[end]=a[end];

    }

}

 

 

void merge(int *a,int *b,int start,int mid,int end)

{

    int i=start,j=mid+1,k=start;

    while(i<=mid&&j<=end)

    {

       if(a[i]<a[j])

       {

           b[k]=a[i];

           k++;

           i++;

       }

       else

       {

           b[k]=a[j];

           k++;

           j++;

       }

    }

    while(i<=mid)

    {

       b[k++]=a[i++];

    }

    while(j<=end)

    {

       b[k++]=a[j++];

    }

}

归并排序的设计思想就是将整个数组切割成一个个小块,然后将小块排好序,再直接合并。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值