参考http://blog.csdn.net/hkx1n/article/details/3922249
冒泡法:
这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: 复杂度为O(n*n)。当数据为正序,将不会有交换。复杂度为O(0)。直接插入排序:O(n*n)
选择排序:O(n*n)
快速排序:平均时间复杂度log2(n)*n,所有内部排序方法中最高好的,大多数情况下总是最好的。
归并排序:log2(n)*n
堆排序:log2(n)*n
希尔排序:算法的复杂度为n的1.2次幂
下面是一个总的表格,大致总结了我们常见的所有的排序算法的特点。
排序法 | 平均时间 | 最差情形 | 稳定度 | 额外空间 | 备注 |
冒泡 | O(n2) | O(n2) | 稳定 | O(1) | n小时较好 |
交换 | O(n2) | O(n2) | 不稳定 | O(1) | n小时较好 |
选择 | O(n2) | O(n2) | 不稳定 | O(1) | n小时较好 |
插入 | O(n2) | O(n2) | 稳定 | O(1) | 大部分已排序时较好 |
基数 | O(logRB) | O(logRB) | 稳定 | O(n) | B是真数(0-9), R是基数(个十百) |
Shell | O(n^(3/2)) | O(ns) 1<s<2 | 不稳定 | O(1) | s是所选分组 |
快速 | O(nlogn) | O(n2) | 不稳定 | O(nlogn) | n大时较好 |
归并 | O(nlogn) | O(nlogn) | 稳定 | O(1) | n大时较好 |
堆 | O(nlogn) | O(nlogn) | 不稳定 | O(1) | n大时较好 |
public class Px {
public static void main(String[] args) {
int[] a = new int[]{9,8,7,6,5,4,3,2,1};
Px p = new Px();
p.maopao(a);
}
//插入排序理念就是从数组前二个开始,如果第一个大于第二个,就将第二个插入第一个位置,第一个放入第二个位置
//然后是数组的第三个,在前三个中插入,如果第三个小鱼第二个,大于第一个,就插入在第二个位置,
//依次类推,第四个,第五个,一直到数组结束。
public void charupx(int[] args){
for(int i=1;i<args.length;i++){
int j = i-1;
int t = args[i];
while(j>=0&&args[j]>t){
args[j+1]=args[j];
j--;
}
//beacause j已经减了
args[j+1] = t;
System.out.println("=========="+i);
for(int k=0;k<args.length;k++){
System.out.print(args[k]+" ");
}
}
}
/**
* 冒泡算法的理念就是,每一次都将最大或最小的数放在最开始或最后
* 将最大的放在最后,次大的放在次后,第三大的放在倒数第三
* 这样在中间可以减少比较的次数,就是最后的都是最大,次大,倒数第三大...,不需要比较
* @param args
*/
public void maopao(int[] args){
for(int i=0;i<args.length;i++){
int j=0;
for(j=0;j<args.length-i-1;j++){
if(args[j]>args[j+1]){
int temp = args[j];
args[j] = args[j+1];
args[j+1] = temp;
}
}
System.out.println("=========="+i);
for(int k=0;k<args.length;k++){
System.out.print(args[k]+" ");
}
}
}
/**
* 理念就是选择最小的放在第一个位置,次小的第二个位置,第三小的放在第三位置
* @param a
*/
public void xuanzhe(int[] a){
for(int i=0;i<a.length;i++){
int temp;
int index = 0;
temp = a[i];
for(int j=i;j<a.length;j++){
if(temp>a[j]){
temp = a[j];
index = j;
}
}
a[index] = a[i];
a[i] = temp;
System.out.println("=========="+i);
for(int k=0;k<a.length;k++){
System.out.print(a[k]+" ");
}
}
}
}
还有一个链表逆序
这是面试的时候,做错的一道题, 回来一上机就写出来了!太丢人了...
2
3 public class Node
4 {
5
6 int data;
7
8 Node next = null;
9
10
11
12 public Node(int data){
13 this.data = data;
14
15 }
16
17 public static Node reverse(Node head){
18
19 Node p = null;
20 Node q = head;
21
22
23 while(head.next != null){
24
25 p = head.next;
26 head.next = p.next;
27 p.next = q;
28 q = p;
29
30
31 }
32
33 return q;
34 }
35
36
37 public static void main(String[] args){
38 Node head = new Node(0);
39 Node tail = head;
40
41
42 for(int i = 1 ; i < 10; ++i){
43 Node p = new Node(i);
44 tail.next = p;
45 tail = p;
46
47 }
48
49 head = reverse(head);
50 while(head.next != null){
51
52 System.out.println(head.data);
53 head = head.next;
54
55
56 }
57 }
58
59
60}