插入排序
思想
- 只要局部有序,那么整体就有序。
- 每次插入数据前,先遍历哪个比自己大,哪个比自己小,找到插入的位置。
- 最后找到之后再交换就可以了。
实现
public static void doSort(int[] arr) {
for (int i = 1; i < arr.length ; i++) {
int insertValue = arr[i];
int j = i - 1;
while (j >= 0) {
if (arr[j] > insertValue) {
arr[j + 1] = arr[j];
} else {
break;
}
j--;
}
arr[j + 1] = insertValue;
}
}
快速排序
思想
- 只要保证局部小范围有序,那么整体就有序。
- 递归实现,切分到不能切分为止。
- 切分原则,选出基准值,然后不停切分,保证左右两个区间的值,左区间的值小于基准值,右区间的值大于基准值。然后不停的选出范围中的基准值,我使用的是最右边的值基准值。
- 选出来基准值了,那么就遍历数组,将数组中小于基准值的值,与交换标记位的值交换。
实现
public class QuickSortImpl {
public static void swap(int[] arr, int startIdx, int endIdx) {
int temp = arr[startIdx];
arr[startIdx] = arr[endIdx];
arr[endIdx] = temp;
}
public static int splitForBase(int[] arr, int start, int end) {
int base = arr[end];
int i = start - 1;
for (int j = start ; j < end ; j++) {
if (arr[j] < base) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, end);
return i + 1;
}
public static void doSort(int[] arr, int start, int end) {
if (start < end) {
int base = splitForBase(arr, start, end);
doSort(arr, start, base - 1);
doSort(arr, base, end);
}
}
}