算法导论学习

鄙人实属菜鸡,学习算法是谓不自量力,仅仅是记录下学习的过程,可能无甚参考价值。

插入排序:

INSERTION-SORT(A)
for j = 2 to A.length
    key = A[j]
//Insert A[j] into the sorted sequence A[1..j-1].
    i = j-1
    while i > 0 and A[i] > key
        A[i+1]=A[i]
        i=i-1
    A[i+1]=key

C语言实现:

void InsertSort(int A[6])
{
    int i,j,key;
    for(j=2;j<=6;j++)   //从2开始一直到数组尾部,排列好前面的数列
    {
        key=A[j];   //此刻要插入的数字
        i=j-1;      //key前面的一位
        /*key历次与前面的数字进行比较,如果与前面的一位比较结果是前者大,
        那么把前者放到后面,否则key向后移动*/
        while((i>=0) && (A[i]>key)) 
        {
            A[i+1]=A[i];
            i=i-1;
        }
        A[i+1]=key;
    }
}

融合排序:

MERGE(A, p, q, r)
n1 = q-p+1
n2 = r-q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i = 1 to n1
    L[i] = A[p+i-1]
for j = 1 to n2
    R[j] = A[q+j]
L[n1+1] = inf
R[n2+1] = inf 
i=1
j=1
for k = p to r
    if L[i] <= R[j]
        A[k] = L[i]
        i = i+1
    else A[k] = R[j]
        j = j+1

MERGE-SORT(A,p,r)
if p < r
    q = [(p+r)/2]
    MERGE-SORT(A,p,q)
    MERGE-SORT(A,q+1.r)
    MERGE(A,p,q,r)

C语言实现:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
void Merge(int A[],int p,int q,int r)
{
    int i,j,k,n1,n2;
    int L[SIZE],R[SIZE];
    n1=q-p+1;
    n2=r-q;
    for(i=0;i<n1;i++)
        L[i]=A[p+i];
    for(j=0;j<n2;j++)
        R[j]=A[q+1+j];
    L[n1]=9999;
    R[n2]=9999;
    i=0;
    j=0;
    for(k=p;k<=r;k++)
    {
         if(L[i]<=R[j])
         {
             A[k]=L[i];
             i=i+1;
         }else
         {
             A[k]=R[j];
             j=j+1;
         }
    }
}
void MergeSort(int A[],int p, int r)
{
    int q;
    if(p<r)
    {
        int q=(p+r)/2;
        MergeSort(A,p,q);
        MergeSort(A,q+1,r);
        Merge(A,p,q,r);
    }
}
int main()
{
    int i,b[]={8,3,5,1,4,9,2,7,20,0};
    MergeSort(b,0,SIZE-1);
    for(i=0;i<SIZE;i++)
        printf("%d ",b[i]);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值