几个简单的排序
冒泡排序
这是一个简单但是经典的排序:
//冒泡排序,在第一次排序中就将最后一个最大的元素放在了最后一个位置
public void sort(int[] a) {
for(int p=a.length-1;p>=0;p--) {
//设定一个标志,如果在某一次内循环中已经就序,那么就不用再进行排序
int flag = 0;
for(int i =0;i<p;i++) {
if(a[i]>a[i+1]) {
int temp =a[i];
a[i]=a[i+1];
a[i+1]=temp;
flag=1;
}
}
if(flag==0) {
break;
}
}
}
插入排序
public void sort (int[] a) {
for(int p =1;p<a.length;p++) {
//先选一个数
int temp=a[p];
int i;//定义这个数最后要放的位置
//从这张牌的位置起,如果这个数比它前面一个小,就把前面这个值放在临时数的位置,不断循环,直到这个临时值
//大于等于前面一个值,就插入i这个位置
for(i =p;i>0&&a[i-1]>temp;i--) {
a[i]=a[i-1];
}
a[i]=temp;
}
}
希尔排序
public void sort (int[] a){
//定义增量序列
for(int D=a.length/2;D>0;D=D/2) {
//进行插入排序
for(int p=D;p<a.length;p++) {
int temp = a[p];
int i;
for( i =p;i>0&&a[i-D]>temp;i--) {
a[i]=a[i-D];
}
a[i]=temp;
}
}
}
但是这个增量序列其实有点问题,因为序列之间有最大公约数不互质,在一些特殊情况下,仅仅在最后一趟序列为1时才起作用,这样它的时间复杂度其实和普通的插入排序一致都是n方,但是如果采用其他的一些增量序列在时间复杂度上会有比较好的表现,有兴趣的朋友可以自己尝试下。

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



