c 语言经典算法,持续更新

 #include <stdio.h>
#include <stdlib.h>

void insertSort(int a[],int count)   /*count为排序数字个数*/
{
    int i,j,temp;
    for(i=1;i<count;i++)    /*依次插入数字到它前面已经排好序的数字中去*/
    {
        temp=a[i];
        j=i-1;
        while(a[j]>temp && j>=0) /* 查找插入元素位置 */
        {
            a[j+1]=a[j];
            j--;
        }
        if(j!=(i-1)) /*判定是否需要重新插入*/      
        {
            a[j+1]=temp;
        }
    }
}
void selectSort(int a[],int count)
{
    int i,j,min,temp;
    for(i=0;i<count-1;i++)
    {
        min=i;            // 假定第一个数最小,记录其下标
        for(j=i+1;j<count;j++)
        {
            if(a[j]<a[min])    min=j;   // 有更小的数,替换其最小值下标。
        }
        if(min!=i)        //  判断是否需要交换
        {
            temp=a[min];
            a[min]=a[i];
            a[i]=temp;
        }
    }
}
void BibleSort(int a[],int count)
{
    int i,j,temp;
    for(i=0;i<count-1;i++)
    {
        for(j=i+1;j<count;j++)
        {
            if(a[j]<a[i]) //  判断是否需要交换
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }
}

int split(int a[],int left,int right)
{
    int i,j,temp;
    i=left, j=right, temp=a[left]; //保存第1个元素
    while(i!=j)/*遍历整个数组*/
    {
        while(a[j]>=temp && j>i) j--;
        if(j>i) a[i++]=a[j];        //将右侧大的数据放到左边
        while(a[i]<=temp && j>i) i++;
        if(j>i) a[j--]=a[i];        //将左侧大的数据放到右边
    }
    a[i]=temp; /*找到该元素最终位置*/
    return i; /* 返回分界点 */
}

void quickSort(int a[],int left,int right)
{
    int s;
    if(left>right) return;
    s=split(a,left,right); /* 分治 */
    quickSort(a,left,s-1);/*递归左边*/
    quickSort(a,s+1,right);/*递归右边*/
}

int BinarySearch(int a[], int x,int n)
{
    int left=0;
    int right=n-1;
    while(left<=right){
        int middle=(left+right)/2;
        if (x==a[middle]) return middle;
        if (x>a[middle]) left=middle+1;
        else right=middle-1;
    }
    return -1;
}
void printresult(int a[],int size)
{
    int i;
    for(i=0;i<size;i++)
    {
        printf("%d ",a[i]);
    }
    printf("/n");
}
int main(void)
{
    int a[9]={6,3,2,9,4,8,7,5,1};
//    BibleSort(a,9);
//    printresult(a,9);
//    selectSort(a,9);
//    printresult(a,9);
//    insertSort(a,9);
//    printresult(a,9);
    quickSort(a,0,9);
    printresult(a,9);
}


名称hash, 我喜欢用这个, 很好。

unsigned int namehash(const char *name)
{
    unsigned int hash = 1315423911;
    int len=strlen(name);
    int i;
    for(i=0; i<len; i++)
    {
        hash ^= (hash << 5) + name[i] + (hash>>2);
    }
    return hash & HASH_TABLESIZE;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值