冒泡排序
数组元素 两两对比,让最大的元素升到数组最后位置,或最小值降到数组最后位置。
【Java版】代码实现
public class MyTest {
public static void main(String[] args) {
int[] array = new int[]{1, 2, 3, 4, 5, 6, 7};
bubbleSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
public static void bubbleSort(int[] nums) {
for (int i = nums.length - 1; i > 0; i--) { // 一共跑多少趟
for (int j = 0; j < i; j++) { // 每趟都从下标0开始往后遍历
if (nums[j] < nums[j + 1]) {
swap(nums, j, j + 1);
}
}
}
}
public static void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
注意:
- 外层循序小技巧:i = nums.length - 1;每次从头开始两两对比,直到 i 位置停止
选择排序
每次从无序子数组中挑选一个最小的元素,与无序子数组最左侧进行交换
【Java版】代码实现
public class MyTest {
public static void main(String[] args) {
int[] array = new int[]{5, 4, 3, 2, 1};
selectionSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
public static void selectionSort(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int min_index = i;
for (int j = i + 1; j < nums.length; j++) {
if (nums[min_index] > nums[j]) {
min_index = j;
}
}
swap(nums, i, min_index);
}
}
public static void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
注意:
插入排序
打扑克时捋牌的过程,从无序牌中按序抽出一张,插入到有序牌中,从有序牌的末尾开始向前遍历找到合适的位置,插入
【Java版】代码实现
public class MyTest {
public static void main(String[] args) {
int[] array = new int[]{5, 4, 3, 2, 1};
insertionSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
public static void insertionSort(int[] nums) {
for (int i = 1; i < nums.length; i++) {
for (int j = i; j > 0; j--) {
if (nums[j] < nums[j - 1]) {
swap(nums, j, j - 1);
}
}
}
}
public static void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
注意:
插入排序
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
【Java版】代码实现
public class MyTest {
public static void main(String[] args) {
int[] array = new int[]{5, 4, 3, 2, 1};
insertionSort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
public static void swap(int[] nums, int i, int j) {
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
注意:
引用
排序算法时间复杂度、空间复杂度、稳定性比较
十大排序算法合集超详细–原理、描述、动画、源码、复杂度、稳定性分析
1.0 十大经典排序算法