您的位置:首页 > 其它

一些简单的算法

2016-03-29 11:41 169 查看
**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定位班级,在班级里找人。**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: