算法导论

第二章

#include <stdio.h>   
#include <stdlib.h>   
#include <time.h>   
  
//插入排序
void InsertSort(int A[], int n)
{
    int i, j, key;
    for(i=1; i<n; i++)
    {
        key = A[i];
        j = i-1;
        while(A[j] > key && j>=0)
        {
            A[j+1] = A[j];
            j--;
        }
        A[j+1] = key;
    }
}


//递归的插入排序   
void InsertSortD(int A[],int n)  
{
    int i;  
    int iTemp;  
    if (n > 1)  
    { 
        InsertSort(A,n-1);  
        iTemp = A[n-1];  
        for (i = n-2;i >= 0 && A[i] >iTemp;--i)  
            A[i+1] = A[i];  
        A[i+1] = iTemp; 
    }
}  
//迭代的二分查找   
int BinarySearch(int A[], int n, int x)  
{  
    int low;  
    int high;  
    int mid;  
  
    low = 0;  
    high = n-1;  
  
    while (low <= high)  
    {  
        mid = low + (high - low) / 2;  
        if (x == A[mid])  
            return mid;  
        else if (A[mid] > x)  
            high = mid - 1;  
        else  
            low = mid + 1;  
    }  
    return -1;  
}    
  
//递归的二分查找的代码   
int BinarySearch2(int A[],int low, int high, int x)  
{     
    int mid; 
    if (low > high)  
        return -1;  
     
    mid = low + (high-low)/2;  
    if (A[mid] < x)  
        return BinarySearch2(A,mid+1,high,x);  
    else if (A[mid] > x)  
        return BinarySearch2(A,low,mid-1,x);  
    else  
        return mid;  
}  
  
int main()  
{     
    int i;  
    int A[10];  
      
    srand(time(NULL));  
    for (i = 0; i < 10; ++i)  
    {  
        A[i] = rand() % 20;  
        printf("%d ",A[i]);  
    }  
    printf("\n");  
      
    InsertSort(A,10);  

    for (i = 0; i < 10; ++i)  
        printf("%d ",A[i]);  
    printf("\n");  
    
    printf("%d \n",BinarySearch2(A,0,9,6));  
    
    return 0;  
} 
//二分插入排序
#include <stdio.h>   
#include <stdlib.h>   
#include <string.h>   
#include <time.h>   
  
//迭代的二分查找查找第一个不小于x的数的位置   
int BinarySearch(int A[], int n, int *i,int x)  
{  
    int low;  
    int high;  
    int mid;  
      
    low = 0;  
    high = n-1;  
      
    while (low <= high)  
    {  
        mid = low + (high - low) / 2;  
        if (x == A[mid])  
        {  
            *i = mid + 1;  
            return 1;  
        }  
        else if (A[mid] > x)  
            high = mid - 1;  
        else  
            low = mid + 1;  
    }  
    *i = low;  
    return 0;  
}  
  
//二分插入排序   
void BinaryInsertSort(int A[], int n)  
{  
    int i;  
    int iPos;  
    int iTemp;  
  
    for (i = 1; i <= n-1; ++i)  
    {  
        iTemp = A[i];  
        BinarySearch(A,i,&iPos,iTemp);  
        memmove(A+iPos+1,A+iPos,(i-iPos)*sizeof(int));  
        A[iPos] = iTemp;          
    }  
}  
  
int main()  
{     
    int i;  
    int A[10];  
      
    srand(time(NULL));  
    for (i = 0; i < 10; ++i)  
    {  
        A[i] = rand() % 20;  
        printf("%d ",A[i]);  
    }  
    printf("\n");   
  
    BinaryInsertSort(A,10);  
  
    for (i = 0; i < 10; ++i)  
        printf("%d ",A[i]);  
    printf("\n");  
  
    return 0;  
}  

 

转载于:https://www.cnblogs.com/tangzhengyue/archive/2012/09/02/2667388.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值