一、插入排序
1.直接插入
2.希尔插入
二、选择排序
1.选择排序
2.堆排序
三、交换排序
1.冒泡排序
(1)一种不太有用的优化
普通快排是每次将最大(最小)的元素放到最后,所以优化方法一就是在每次遍历的时候,把最小值放最前面,最大值放最后面。代码如下:
public static int[] Bubble3 ( int r[]){
int n = r.length;
int low = 0;
int high= n -1; //设置变量的初始值
int tmp,j;
while (low < high) {
for (j= low; j< high; ++j){ //正向冒泡,找到最大者
if (r[j]> r[j+1]) {
tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;
}
}
--high; //修改high值, 前移一位
for ( j=high; j>low; --j){ //反向冒泡,找到最小者
if (r[j]<r[j-1]) {
tmp = r[j]; r[j]=r[j-1];r[j-1]=tmp;
}
}
++low; //修改low值,后移一位
}
return r;
}
(二)比较有效的优化方式
冒泡排序可以优化的点就是当剩下的数组是已经排好序的时候,循环不会再有交换,所以可以设置一个flag来标识本轮是否有发生交换,如果有则标识数组还不是有序的,需要继续循环,如果本轮都没有交换,则表示数组已经排好序了,这时就可以直接退出,从而避免不必要的循环了。代码如下:
public static void bubbleSort(int[] arr){
if(arr == null || arr.length < 2)
return;
int len = arr.length;
for(int i = len - 1; i > 0; i--){
boolean flag = false;
for(int j = 0; j < i; j++){
if(arr[j] > arr[j+1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
flag = true;
}
}
if(flag == false)
return;
}
}
2.快速排序
快排的优化见我转载的一篇文章:快排的优化策略(3种快排4种优化)