1.冒泡排序
/**
* 冒泡排序算法
* <p/>
* 依次把第i个元素与 i+1到arr.length的元素进行比较,
* 发现有比i更小(大)的元素的话,则进行位置替换
* <p/>
* 第i次遍历,保证i是 i+1到arr.length里面最小(大)的元素
*
* 时间复杂度O(n*n)
*/
public void bubbleSort(int[] arr) {
System.out.println("排序前:" + Arrays.toString(arr));
int tmp;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
System.out.println("排序后:" + Arrays.toString(arr));
}
2.快速排序
/**
* 快速排序
* 分治思想,大于idx的放右边,小于idx的放左边,保证idx是正确的位置,
* 然后同时对i的左边和右边分别进行排序
*/
public static void quickSort(int[] arr) {
System.out.println("排序前:" + Arrays.toString(arr));
sort1(arr, 0, arr.length - 1);
System.out.println("排序后:" + Arrays.toString(arr));
}
public void sort1(int[] arr, int left, int right) {
int low = left;
int high = right;
int key = arr[left];
while (low < high) {
while (low < high && arr[high] >= key) {
high--;
}
if (low < high) {
int temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
low++;
}
while (low < high && arr[low] <= key) {
low++;
}
if (low < high) {
int temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
high--;
}
}
if (low > left) {
sort1(arr, left, low - 1);
}
if (high < right) {
sort1(arr, low + 1, right);
}
}
3.插入排序
/**
* 插入排序
* 第i次循环保证 [0-i]的数据是有序的,然后第i个数继续加入到有序列表
* 基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据
* 算法适用于少量数据的排序,时间复杂度为O(n^2)
*/
public void insertionSort(int[] arr) {
System.out.println("排序前:" + Arrays.toString(arr));
for (int i = 1; i < arr.length; i++) {
int curr = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > curr) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = curr;
}
System.out.println("排序后:" + Arrays.toString(arr));
}