算法复习

快速排序

把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。

http://blog.csdn.net/wangkuifeng0118/article/details/7286332

位图排序

使用bit存储数据并排序,优点是快速、占用资源少,缺点是只能对整数使用可以分三个阶段来编写程序

第一阶段:将所有的位都置为0,从而将集合初始化为空。

第二阶段:通过读入文件中的每个整数来建立集合,将每个对应的位置都置为1。

第三阶段:检验每一位,如果该为为1,就输出对应的整数,有此产生有序的输出文件。

http://www.cnblogs.com/biyeymyhjob/archive/2012/08/14/2636933.html

JAVA实现 http://chroya.iteye.com/blog/790736      http://blog.csdn.net/lovesqcc/article/details/6204224

归并排序

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。

http://blog.csdn.net/morewindows/article/details/6678165

求交集

假设有集合A={1, 7, 5, 13, 9, 10, 11}, B={5, 7, 10, 1, 18, 12},

1)求交集,需要得到结果:A∩B={1, 5, 7,10}

   思路如下:

   ①建立一个哈希表(HashMap),其键(KEY)表示集合中数字的值,其值(VALUE)表示集合中数字出现的次数

   ②遍历集合A,将集合中的每个数字(KEY)插入哈希表,每个数字的出现次数(VALUE)设置为1

   ③遍历集合B,对于集合中的每个数字:

                   如果哈希表中已经存在该数字,将对应的VALUE改为2

                   如果哈希表中不存在该数字,忽略

    ④用数组的值作为键遍历哈希表,输出VALUE为2的数字,即得到A和B的交集

冒泡排序

将数组连起来成最大值 如:984 98 975 975 970 941 937 936 932 93 930 9  896 889 886 882 875 851 820 810 8 791 *****

public static void main(String[] args) {
int[] t=new int[100];
Random r = new Random();  
for(int i=0;i<100;i++){
int k=r.nextInt(1000);
t[i]=k;
System.out.print(k+" ");
}
for(int i=0;i<99;i++){
for(int y=0;y<100-i-1;y++){
if(!comp(t[y],t[y+1])){
int temp=t[y];
t[y]=t[y+1];
t[y+1]=temp;
}
}
}
System.out.println();
for(int i=0;i<100;i++){
System.out.print(t[i]+" ");
}
}
public static boolean comp(int x,int y){
String s=""+x;
String t=""+y;
if(s.length()>t.length()){
int a=s.length()-t.length();
for(int i=0;i<a;i++) t+="0";
}else {
int a=t.length()-s.length();
for(int i=0;i<a;i++) s+="0";
}
int xx=Integer.parseInt(s);
int yy=Integer.parseInt(t);
if(xx-yy>0) return true;
else return false;
}

扩展堆栈(stack) O(1) 时间访问栈中最小值(或最大值)

问题描述:扩展stack的实现,完成正常的push,pop操作,新增访问最小(或最大)元素的接口Min(),使得push,pop,Min的时间复杂度都是O(1)。

问题分析:拿到这道题,我们最先的思考往往是,设计一个算法从栈中拿到最小值,所以开始考虑任何可以用来实现该功能的排序和查找算法。假设栈中有n个元素,一切排序和查找都不可能实现O(1)的时间复杂度找到最小值。

再看题目,既然是扩展stack的实现,stack是一种数据结构,一种数据的组织方式,扩展它,也就允许我们对其数据组织方式和存储内容作一些改变吧。所以我们就有了下面的思路:

把当前最小值存起来,并且在进行push和pop操作的时维护它。维护要求如下:

1、如果有比当前最小值大的元素入栈,当前最小值不变

2、如果有比当前最小值小(或等于)的元素入栈,当前最小值变为新加入元素

3、如果有比当前最小值大的元素出栈,当前最小值不变(注意:弹出的操作时,一定不可能弹出比当前最小值还小的元素,也就是说如果你弹出了一个比当前最小值还小的元素,就证明你的那个当前最小值不是当前最小值)

4、如果有和当前最小值的元素相同出栈,当前最小值变为当前当前最小值入栈之前那个最小值,当前最小值退出。

综上,我们发现一个规律:对于最小值而言,如果有更小的数入栈,需要将其保存为当前最小,如果当前最小数出栈,当前最小数变成当前最小数入栈之前那个最小数,所以,对于最小数而言也具有先进后出,后进先出的特点,只是并不是每次push和pop操作都牵涉到最小数的进出。所以我们考虑用双栈来实现,一个栈用来存放数据,满足栈数据结构原始要求,一个栈用来存放最小值,在每次push和pop操作执行时,按照上面的规则维护最小值栈。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值