课本上经典的排序算法复习

参考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是基数(个十百)

ShellO(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]+" ");
}
}
}


}



还有一个链表逆序

这是面试的时候,做错的一道题, 回来一上机就写出来了!太丢人了...

 1 package  ch01;
 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}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值