常用算法代码

1、给出折半插入排序的代码?
答、
int main(){
    int i,j,low,high,mid,temp;
    int srcsum[10]={10,91,8,71,61,5,41,3,21,1};
    for(i=2;i<sizeof(srcsum)/4;i++)
    {
        temp=srcsum[i];
        low=0;high=i-1;
        while(low<=high)
        {
            mid=(low+high)/2;
            if(srcsum[mid]>temp)high=mid-1;
            else
                low=mid+1;
        }
        for(j=i-1;j>=high+1;j--)
        {
            srcsum[j+1]=srcsum[j];
        }
        srcsum[high+1]=temp;
    }


    for(int i=0;i<sizeof(srcsum)/4;i++)
    {
        printf("srcsum[%d]=%d",i,srcsum[i]);
    }


}


2、冒泡排序?
答、
int main01(int argc, char *argv[])
{
    // bubble sorting
    int src[10]={3,1,55,23,15,11,78,13,2,56};
    for(int i=0;i<sizeof(src)/4;i++)
    {
        for(int j=sizeof(src)/4-1;j>i;j--)
        {
            if(src[j]<src[j-1])
            {
                int temp=src[j];
                src[j]=src[j-1];
                src[j-1]=temp;
            }
        }
    }


    for(int i=0;i<sizeof(src)/4;i++)
    {
        printf("src[%d]=%d ",i,src[i]);
    }


    printf("Hello World!\n");
    return 0;
}


优化的冒泡排序?
答、
public void bubbleSort(int arr[]) {
    boolean didSwap;
    for(int i = 0, len = arr.length; i < len - 1; i++) {
        didSwap = false;
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j]) {
                swap(arr, j, j + 1);
                didSwap = true;
            }
        }
        if(didSwap == false)
            return;
    }    
}


3、选择排序?
答、
int main02()
{
    // choose
    int srcnum[10]={10,9,8,7,6,5,4,3,2,1};
    int min=0;
    for(int i=0;i<sizeof(srcnum)/4;i++)
    {
        min=i;
        for(int j=i+1;j<sizeof(srcnum)/4;j++)
        {
            if(srcnum[min]>srcnum[j])
            {
                min=j;
            }
        }
        int temp=srcnum[i];
        srcnum[i]=srcnum[min];
        srcnum[min]=temp;
    }


    for(int i=0;i<sizeof(srcnum)/4;i++)
    {
        printf("srcnum[%d]=%d ",i,srcnum[i]);
    }
    return 0;
}


4、插入排序?
答、
int main03()
{
    // insert
    int srcnum[10]={10,91,8,71,61,5,41,3,21,1};
    int j=0;
    for(int i=1;i<sizeof(srcnum)/4;i++)
    {
        int temp=srcnum[i];
        for(j=i-1;j>=0&&(srcnum[j]>temp);--j)
        {
            srcnum[j+1]=srcnum[j];
        }
        srcnum[j+1]=temp;
    }


    for(int i=0;i<sizeof(srcnum)/4;i++)
    {
        printf("srcnum[%d]=%d ",i,srcnum[i]);
    }


    return 0;
}


5、快速排序?
答、
int pivotPosition(int srcsum[1],int pivot,int low,int high)
{
    while(low<high)
    {
        while((low<high)&&(srcsum[high]>=pivot))high--;
        srcsum[low]=srcsum[high];
        while((low<high)&&(srcsum[low]<=pivot))low++;
        srcsum[high]=srcsum[low];
    }


    srcsum[low]=pivot;
    return low;
}


void QuickSort(int *srcsum,int low,int high)
{
    if(low<high)
    {
        int pos=pivotPosition(srcsum,srcsum[low],low,high);
        QuickSort(srcsum,low,pos-1);
        QuickSort(srcsum,pos+1,high);
    }
}


int main()
{
    int srcsum[10]={101,900,8,7,6,5,4,3,21,11};
    int pivot=srcsum[0];
    int low=0,high=sizeof(srcsum)/4-1;
    QuickSort(srcsum,low,high);


    for(int i=0;i<sizeof(srcsum)/4;i++)
    {
        printf("srcsum[%d]=%d ",i,srcsum[i]);
    }


    return 0;
}




7、堆排序?
答、


void AdjustDownMy(int *arr,int k,int len);
void bigRootPile(int *arr,int len)
{
    for(int i=len/2;i>=0;i--)
    {
        AdjustDownMy(arr,i,len);
    }
}


void AdjustDownMy(int *arr,int k,int len)
{
    int temp=arr[k];


    for(int i=2*k;i<=len;i*=2)
    {
        if((i<len)&&(arr[i]<arr[i+1]))
        {
            i++;
        }


        if(temp>=arr[i])break;
        else
        {
            arr[k]=arr[i];
            k=i;
        }
    }


    arr[k]=temp;
}


void BigSort(int *arr,int len)
{
    for(int i=0;i<=len;i++)
    {
        int temp=arr[0];
        arr[0]=arr[len-i];
        arr[len-i]=temp;


        AdjustDownMy(arr,0,len-i-1);
    }
}


8、归并排序?
答、


int *B=NULL;
void Merge(int *A,int low,int mid,int high)
{
    for(int i=low;i<=high;i++)
    {
        B[i]=A[i];
    }
    int k=low;
    int i,j;
    for(i=low,j=mid+1;i<=mid&&j<=high;)
    {
        if(B[i]<B[j])
        {
            A[k++]=B[i++];
        }else
        {
            A[k++]=B[j++];
        }
    }


    while(i<=mid)
    {
        A[k++]=B[i++];
    }


    while(j<=high)
    {
        A[k++]=B[j++];
    }


}


void MergeSort(int *arr,int low,int high)
{
    if(low<high)
    {
        int mid=(low+high)/2;
        MergeSort(arr,low,mid);
        MergeSort(arr,mid+1,high);
        Merge(arr,low,mid,high);
    }
}


int main()
{
    int A[8]={11,13,15,17,1,3,5,7};
  //  int A[9]={111,103,15,7,1100,333,5,17,1};
    B=(int *)malloc(sizeof(A));


   // Merge(A,0,3,7);
   // MergeSort(A,0,8);
    MergeSort(A,0,7);
    for(int i=0;i<8;i++)
    {
        printf("%d ",A[i]);
    }
    return 0;
}
------------------------------------------------------------
常用查找算法:
1、问查找算法是根据什么选择的,如何分类?
答、数据结构(线性结构、树形结构、散列结构);
不同数据结构对应的查找算法有哪些?
答、线性结构:顺序查找、折半查找、分块查找;
树形结构:二叉排序树、二叉平衡树、B树、B+树;
散列结构:散列表;


2、KMP字符串匹配
void get_nextOne(char T[],int next[]){
    int i=1,j=0;
    next[0]=0;
    while(i<=T[0])
    {
        if(j==0||T[i]==T[j])
        {
            ++i;
            ++j;
            next[i-1]=j;
        }
        else
        {
            j=next[j-1];
        }
    }
}


int KMPOne(char S[],char T[],int next[],int pos)
{
    if(pos==0)
    {
        return -1;
    }


    int i=pos,j=1;
    while(i<S[0]&&j<T[0]){
        if(j==0||S[i]==T[j]){
            ++i;
            ++j;
        }
        else{
            j=next[j-1];
        }


    }


    if(j==T[0])
    {
        return 0;
    }else
    {
        return -1;
    }
}


简单字符串匹配
int Index(char*S,char *T)
{
int i=1,j=1;
while(i<=s[0]&&j<=T[0])
{
if(S[i]==T[j]){
++i;++j;
}else
{
i=i-j+2;j=1;
}
if(j>T[0])return i-T[0];
else
return 0;
}

Algorithms   本次README修订为算法仓库Algorithms的第100次commit,首先我们庆祝自2016年8月4日本仓库建立以来Dev-XYS在算法学习方面取得的显著进步!   这里有各种算法的C++代码,任何人可以在自己的任何程序中使用,欢迎大家指出代码中的错误以及有待改进的地方。   本仓库内所有代码的授权方式为Unlicense,大家如果使用我的代码开发自己的软件挣了大钱,或是参考我的代码在NOI中得了金牌,我都会很高兴的。使用这里的代码之后,你可以自主选择是否公开源代码。总而言之,你可以把这里的代码当作你自己写的一样,无论怎样使用都是被允许的。但是,我不对本仓库内代码的正确性负责。大家要是使用我的代码开发软件而导致程序崩溃,或是参考我的代码在考试时出错,请不要向我抱怨。如果你愿意,遇到问题可以在Issues中提出来,我们共同解决。我们不赞成Pull Request,因为本仓库主要储存作者已经学习的算法,全部代码均由作者本人负责维护与更新。   以下索引提供了本仓库内算法的中文名,方便大家查找。更新可能有很长时间的延迟,不保证所有算法的名称都在列表中出现。 Index --------------------------Contents-------------------------- --------------------------FileName-------------------------- AC自动机 Aho-Corasick-Automation 单源最短路径(SPFA) Bellman-Ford(Queue-Optimised) 单源最短路径(Bellman-Ford) Bellman-Ford 使用Edmonds-Karp进行二分图匹配 Bigrpah-Matching(Edmonds-Karp) 普通的二叉搜索树 Binary-Search-Tree 广度优先搜索 Breadth-First-Search 冒泡排序 Bubble-Sort 桶排序 Bucket-Sort 组合数的递推求解 Combination(Recursion) 枚举组合 Combination 基本的复数类 Complex-Number 割点 Cut-Vertex 深度优先搜索 Depth-First-Search 堆优化的Dijkstra算法 Dijkstra(Heap-Optimised) 并查集 Disjoint-Set-Union 最大流Edmonds-Karp算法 Edmonds-Karp 欧拉函数 Euler's-Totient-Function 有向图的欧拉回路 Eulerian-Tour(Digraph) 拓展欧几里得算法 Extended-Euclid 简单的快速幂 Fast-Exponentiation 树状数组 Fenwick-Tree 所有结点对之间的最短路径(Floyd) Floyd-Warshall 凸包算法(Graham扫描法) Graham-Scan 辗转相除法求最大公约数 Greatest-Common-Divisor 堆排序 Heap-Sort ISAP算法 Improved-Shortest-Augmenting-Path(Naive) 插入排序 Insertion-Sort 字符串匹配(KMP) Knuth-Morris-Pratt 最小生成树(Kruskal) Kruskal 最近公共祖先(Tarjan) Least-Common-Ancestor(Tarjan) 使用后缀数组求解最长公共子串 Longest-Common-Substring 最长上升子序列(n·log(n)) Longest-Increasing-Subsequence(n·log(n)) 倍增法求最近公共祖先 Lowest-Common-Ancestor(Doubling) 朴素的矩阵乘法 Matrix-Multiplication(Naive) 归并排序 Merge-Sort 最小堆 Min-Heap 乘法逆元 Modular-Multiplicative-Inverse 仅支持单点修改的可持久化线段树(维护区间和值) Persistent-Segment-Tree(Sum) 试除法素数测试 Prime-Check(Naive) 线性的素数筛法 Prime-Sieve(Linear) 队列的基本操作 Queue 快速排序的优化版本 Quick-Sort(Extra-Optimised) 快速排序的随机化版本 Quick-Sort(Randomized) 快速排序 Quick-Sort 使用向量叉积判断两个有向线段的时针关系 Segment-Direction 线段树维护区间最大值 Segment-Tree(Maximum) 线段树维护区间最小值 Segment-Tree(Minimum) 线段树维护区间和值 Segment-Tree(Sum) 普通的选择算法 Selection Eratosthenes素数筛法 Sieve-of-Erotosthenes 指针版的单向链表 Singly-Linked-List(Pointer) 跳表 Skip-List ST表 Sparse-Table 伸展树 Splay 博弈论SG函数 Sprague-Grundy 栈的基本操作 Stack 递推法求解无符号第一类斯特林数 Stirling-Number(Cycle,Unsigned,Recursion) 递推法求解第二类斯特林数 Stirling-Number(Subset,Recursion) 倍增法求解后缀数组 Suffix-Array(Doubling) 倍增法求解后缀数组(附带Height数组) Suffix-Array-with-Height(Doubling) 使用Tarjan算法求解强连通分量 Tarjan(Strongly-Connected-Components) 数组版的字典树 Trie(Array) 指针版的字典树 Trie(Pointer)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值