参考资料:zhuanlan.zhihu.com/p/42586566
冒泡排序
排序原理
两两对比,每一次循环都保证最右边一个是最大的;
时间复杂度
冒泡排序因为要两个循环,因此复杂度是。
代码实现
public class BubbleSort {
public static void main(String[] args) {
int[] nums = {67, 1, 8, 33, 67, 100,2, 32, 27, 22};
bubbleSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void bubbleSort(int[] nums) {
int len = nums.length;
// 注意这里的循环条件,外循环表示每次需要比较的长度,每一次循环结束都会-1
for (int i = len-1; i > 0; i--) {
// 内循环从0开始依次相邻的两两比较
for (int j = 0; j < i; j++) {
if(nums[j]>nums[j+1]) {
int tmp = nums[j];
nums[j]=nums[j+1];
nums[j+1] = tmp;
}
}
}
}
}
选择排序
排序原理
选择排序从左边开始,以第一个为标准,寻找右边里面所有的最小的值,并和标准值比较并互换位置;
时间复杂度
选择排序因为要两个循环,因此复杂度是。
代码实现
public class SelectionSortTest {
public static void main(String[] args) {
int[] nums = {67, 1, 8, 33, 67, 100,2, 32, 27, 22};
selectionSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void selectionSort(int[] arr) {
int temp, min = 0;
for (int i = 0; i < arr.length - 1; i++) {
min = i;
// 循环查找最小值
for (int j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
if (min != i) {
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}
}
快速排序
排序原理
快速排序的每一次排序,会选择一个基准值,然后把右边都变成比基准值大的,左边都变成比基准值小的;
时间复杂度
快排的时间复杂度是 。
代码实现
public class quickSortTest {
public static void main(String[] args) {
int[] nums = {67, 1, 8, 33, 67, 100,2, 32, 27, 22};
quickSort(nums,0,nums.length-1);
System.out.println(Arrays.toString(nums));
}
public static void quickSort(int[] nums,int low , int high) {
if (low<high){
int mid = getMid(nums, low, high);
quickSort(nums, low, mid);
quickSort(nums, mid+1, high);
}
}
public static int getMid(int[] nums, int low, int high) {
int index = nums[low];
// 注意与index的比较要包含“等于”条件
while (low<high) {
while (low<high && nums[high]>=index) high--;
nums[low] = nums[high];
while (low<high && nums[low]<=index) low++;
nums[high] = nums[low];
}
nums[low] = index;
return low;
}
}