简单算法随笔(持续更新)

一 .递归

递归的两个特点

1.调用自身

2.结束条件

汉诺塔问题

二.查找

顺序查找()

二分查找(前提是有序性)

基础1 数组无重复

int binseach (int *arr,int n,int key)
{
    int left=0,right=n-1;
    int mid=0;
    while(left+1<right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] <key)
        {
            left = mid;
        } else
            right = mid;
    }
        if(arr[right]==key)return right;
        if(arr[left]==key)return left;
        return -1;


}

如果序列存在重复key,返回key的最大下标

核心修改代码

 if (arr[mid] <=key)
        {
            left = mid;
        } else
            right = mid;

返回大于key值的最小下标

int binseach (int *arr,int n,int key)
{
    int left=0,right=n-1;
    int mid=0;
    while(left+1<right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] <=key)
        {
            left = mid;
        } else
            right = mid;
    }
        if(arr[right]>key)return right;
        if(arr[left]>key)return left;
        return -1;


}

返回小于key的最大下标

int binseach (int *arr,int n,int key)
{
    int left=0,right=n-1;
    int mid=0;
    while(left+1<right)
    {
        int mid = (left + right) / 2;
        if (arr[mid] <key)
        {
            left = mid;
        } else
            right = mid;
    }
    if(arr[right]<key)return right;
    if(arr[left]<key)return left;
    return -1;


}

排序

 1插排(摸牌的过程)

void Insertsort(int *arr,int n)
{
    for(int i=0 ;i<n-1;++i)
    {
        int end=i;
        int temp=arr[end+1]
        while(end>=0)                  ///  在挪动整个数组
        {
            if(arr[end]>temp)
            {
                arr[end+1]=arr[end];
                end--;
            }
            else
                break;
        }
        arr[end+1]=temp


    }

希尔排序

1.先进行预排序

2,直接插入排序

void shellsort(int *arr,int n)
{
    int gap=n;
    while(gap
    >1)
    {
        gap/=2;
        for(int i=0;i<n-gap;++i)
        {
            int end=i;
            int temp=arr[end+gap];
            while(end>=0)
            {
                if(arr[end]>temp)
                {
                    arr[end+gap]=arr[end];
                    end-=gap;
                }
                else
                    break;
            }
            arr[end+gap]=temp;
        }


    }


}

 直接选择排序

void select(int arr[],int n)
{
    int begin=0,end=n-1;
    while(begin<end)
    {  int mini=begin,maxi=begin;
        for(int i=begin ;i<=end ;++i)
        {
            if(arr[i]<arr[mini])
                mini=i;
            if(arr[i]>arr[maxi])
                maxi=i;
        }
        swap(&arr[begin],&arr[mini]);
        if(begin==maxi)
        {
            maxi=mini;
        }
        swap(&arr[maxi],&arr[end]);
    begin++;
    end--;
    }
}

冒泡


单词 翻转但不乱叙 

空格串+非空+空+非空。。。。

 void sort1(char arr[],int a)
{int i,j,k;
    while ( 1 )
    {
        while(i<a&&arr[i]==' ')
        {

            i++;
        }
        if(i>=a) break;
        j=i;
        while(j<a&&arr[j]!=' ')
        {
            j++;
        }
        for(k=j-1;k>=i;k--,i++)
        {  char c=0;
            c=arr[i];
            arr[i]=arr[k];
            arr[k]=c;


        }
        i=j;
    }
}


int main()
{
    char arr[100] = {0};
    gets(arr);
   int i,j,k;
   k=strlen(arr);
sort1(arr,k);
for(int h=k-1
        ;h>=0;h--)
{
    printf("%c",arr[h]);
}
printf("\n");

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值