参考http://blog.youkuaiyun.com/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]+" ");
}
}
}
}
还有一个链表逆序
这是面试的时候,做错的一道题, 回来一上机就写出来了!太丢人了...
package
ch01;2

3
public
class
Node4
{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
}
本文详细介绍了多种排序算法,包括冒泡排序、直接插入排序、选择排序等,并对比了它们的时间复杂度及稳定性。同时提供了Java实现代码示例。
1万+

被折叠的 条评论
为什么被折叠?



