zoukankan      html  css  js  c++  java
  • 一些算法的笔记

    二分查找:

    int binsearch(int x,int s[],int n){
        int i,j,middle,left,right;
        // middle=n/2;
        right=n-1;
        while(left<=right){
            middle=(right+left)/2;
            if(x>s[middle])
                left=middle+1;
            else if(x<s[middle])
                right=middle-1;
            else
                return middle;
        }
        return -1;
    }

    希尔排序:

    void shellsort(int *s,int n){
        int i,j,gap=n/2,temp;
        while(gap>0){
            gap/=2;
            for(i=gap;i<n;i++)
                for(j=i-gap;s[j]>s[j+gap]&&j>=0;j-=gap)
                    temp=s[j],s[j]=s[j+gap],s[j+gap]=temp;
        }
    }

     归并排序:

    void merge(int *a,int *t,int leftend,int middle,int rightend){
        int leftop=leftend,rightop=middle,i=leftend;
        while(leftop<middle&&rightop<=rightend){
            if(a[leftop]<=a[rightop])
                t[i++]=a[leftop++];
            else 
                t[i++]=a[rightop++];
        }
        while(leftop<middle){
            t[i++]=a[leftop++];
        }
        while(rightop<=rightend){
            t[i++]=a[rightop++];
        }
        for(i=rightend;i>=leftend;i--){
            a[i]=t[i];
        }
    }
    void msort(int *a,int *t,int leftend,int rightend){
        if (leftend==rightend)
        {
            return;
        }
        int middle;
        middle=(rightend+leftend)/2;
        msort(a,t,leftend,middle);
        msort(a,t,middle+1,rightend);
        merge(a,t,leftend,middle+1,rightend);
    }

     堆排序:

    void sift(int *s,int low,int high){
        int i=low;
        int j=2*i+1;
        int tmp=s[i];
        while(j<=high){
            // 判断j在二叉树的里面
            if(j+1<=high && s[j+1]>s[j]){
            // 找到最大的二叉树子节点
                j=j+1;
            }
            if(tmp<s[j]){
            // 比较父节点和最大子节点的大小,如果父节点小则下移,如果不小则停止循环
                s[i]=s[j];
                i=j;
                j=2*i+1;
            }
            else{
                break;
            }
        }
        s[i]=tmp;
        // 把之前堆顶的值放到对应位置
    }
    
    void heap_sort(int *s,int n){
        int i,j,tmp;
        for(i=(n/2-1);i>=0;i--){
        // 从最小的有儿子的节点开始,记住最右面的子节点是s[n-1],n/2-1这个就是最小的有儿子节点的数
            sift(s,i,n-1);
        }
        for(i=n-1;i>0;i--){
            tmp=s[0],s[0]=s[i],s[i]=tmp;
            sift(s,0,i-1);
        // 一步步的出堆,然后把最大值放到最后面
        }
    }
  • 相关阅读:
    linux kill命令以及 信号
    rhel7 系统服务——unit(单元)
    redis集群在线迁移
    二、主目录 Makefile 分析(3)
    二、主目录 Makefile 分析(2)
    二、主目录 Makefile 分析(1)
    一、文档目录分析
    Linux下解压缩
    设备树
    轮询
  • 原文地址:https://www.cnblogs.com/WisWang/p/6028092.html
Copyright © 2011-2022 走看看