把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。
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操作执行时,按照上面的规则维护最小值栈。