一些简单的算法

2 篇文章 0 订阅

**1. 入门算法冒泡排序时间复杂度o(n²),空间复杂度o(1),最差的排序。
2. 快速排序,快速排序(Quicksort)是对冒泡排序的一种改进,排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想—-分治法也确实实用,方法的基本思想是:**
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

public class QuikSort {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int s[]={2,1,4,61,7,5,1};
        quick_sort(s, 0, s.length-1);
        for(int i :s){
            System.out.print(i+",");
        }
    }

    /**
     * 快速排序  
     * @param 待排序数组
     * @param l 左边界索引
     * @param r 右边界索引
     */
    public static void quick_sort(int s[], int l, int r)  
    {  
        if (l < r)  //由此判断停止递归调用,递归后最终r会小于l
        { 
            int i=l,j=r,pos=s[l];
            while(i<j){
                while(i<j&&s[j]>=pos){
                    j--;
                }
                if(i<j){
                    s[i++]=s[j];//将右边比pos大的数赋给左边
                }
                while(i<j&&s[i]<=pos){
                    i++;
                }
                if(i<j){
                    s[j--]=s[i];//将左边比pos小的数赋给上面得出的右边比pos大的数
                }
            }//直到i==j,得出pos最终的位置,左边的数都比pos小,右边的都大
            s[i]=pos;//将pos放回位置上。
            quick_sort(s,l,i-1);//递归当前pos位置的左边
            quick_sort(s,i+1,r);//递归当前pos位置的右边
           }
    }  
}

**3. 100万个数中找最大或最小,设临时变量赋值为数组中第一个元素值,遍历数组遇到大于变量的值,就替换变量的值,然后继续比较。循环一次搞定,时间复杂度为o(n-1)。
4. 100个人羽毛球比赛,挑出水平最高的人,最少比赛n-1场,两两比赛,决出水平高的,再两两比,最后决出胜负。这样他的时间复杂度就是o(n-1),但是在两两比赛的时候,只要有足够的场地,比赛可以同时进行,总体时间就节省下来了,在计算机中就是“多线程技术”,对“问题3”的更优解。
5. 100万个数中 找最大的10个?最小堆的思维,取10个数,迭代数组,只与10个数中最小的数比较,当比最小数大时替换,维护10个数的排序,继续比较,最差的情况就是运算10*100万次。
6. 关于排序,实际场景很重要,杂乱无章的大数据,如果是一定范围类均匀分布,则可用堆排序,如200万个数据,分2000份甚至更多,【1-1000】,【1001-2000】。。。每个区间的数据范围是一小堆,小堆之间是有序的,,因此只要堆的内部有序,就是全局有序了,这个过程需要扫描200万数据一次,因为堆是有序的,采用二分法,可以快速定位自己的堆(每次匹配范围缩小一倍),每个堆自己排序,用多线程来降低计算时间。扩展出来,这就是分布式计算的原理了。
7. hash算法,hash算法有很多种,基本原理是先分班,hashcode定位班级,在班级里找人。**

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值