排序算法java实现
冒泡排序
冒泡排序是通过两轮循环,外层控制循环的次数(也就是当前是第几轮),内层通过循环来两两比较进行排序,每次都将本轮中最大的或者最小的进行冒泡到本轮的最后一个位置,循环往复就将数组的元素排好序了,如下图(图片来源于百度)。
时间复杂度为 O(n^2),是稳定的排序算法。
优化方法通常是增加一个标志位来判断当前序列是否已经有序,是则退出循环。
代码实现
/**
* 冒泡左到右
* @param arr
*/
public static void bubbleSortLF(int[] arr){
int temp = 0;
for (int i = 0; i < arr.length; i++) {
System.out.println("第"+i+"次");
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
/**
* 右往左冒泡
* @param arr
*/
public static void bubbleSortFL(int[] arr){
int temp;
boolean flag = true;//标志位优化
for (int i = 0; i < arr.length; i++) {
System.out.println("第"+i+"次");
//从右往左比较,
for (int j = arr.length-1; j > i; j--) {
if(arr[j] < arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
flag = false;
}
}
if (flag) break;
else flag = true;
}
}
直接插入排序
直接插入排序是将一个数组分成两部分,一部分是有序的,一部分是无序的,每一次排序都取无序序列开头的一个元素将其插入有序序列对应的位置,最终只剩下有序序列,如下图(图片来源于百度)。
时间复杂度为 O(n^2),是稳定的排序算法。
希尔排序是对插入排序的优化。
代码实现
/**
* 直接插入排序
* @param arr
*/
public static void insertSort(int[] arr){
for (int i = 1; i < arr.length; i++) {
int preIndex = i-1;
int curVal = arr[i];
while (preIndex >= 0 && curVal < arr[preIndex]){
arr[preIndex+1] = arr[preIndex];
preIndex--;
}
arr[preIndex+1] = curVal;
}
}