一、冒泡排序

aHR0cHM6Ly9pbWFnZXMyMDE3LmNuYmxvZ3MuY29tL2Jsb2cvODQ5NTg5LzIwMTcxMC84NDk1ODktMjAxNzEwMTUyMjMyMzg0NDktMjE0NjE2OTE5Ny5naWY.gif
代码实现:

  1. import java.util.Arrays;
  2. public class Bubble {
  3. public static void main(String[] args) {
  4. int[] array = {2,12,4,24,3,2,34,12,33,24,28};
  5. int temp;
  6. int a = array.length;
  7. for (int i = 0; i < a; i++) {
  8. int b = array.length-1-i;
  9. for (int j = 0; j < b; j++) { //每次比较都筛选出一个最大的元素,每次遍历减一,可以减少开销
  10. if (array[j+1] < array[j]){
  11. temp = array[j];
  12. array[j] = array[j+1];
  13. array[j+1] = temp;
  14. }
  15. }
  16. }
  17. System.out.println(Arrays.toString(array));
  18. }
  19. }

代码实现阐述:

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。

二、选择排序

  • 时间复杂度为O(n²)

比较排序 - 图2

  • 空间复杂度为O(1)
  • 不稳定的排序算法

选择排序.gif
代码实现:

  1. import java.util.Arrays;
  2. public class Selection {
  3. public static void main(String[] args) {
  4. int[] array = {2, 12, 4, 24, 3, 2, 34, 12, 33, 28, 23};
  5. int temp;
  6. if (array == null || array.length == 0) {
  7. return;
  8. }
  9. for (int i = 0; i < array.length; i++) {
  10. //记录最小元素下标
  11. int minIndex = i;
  12. for (int j = i+1; j < array.length; j++) {
  13. if (array[j] < array[minIndex]) {
  14. //更新下标
  15. minIndex = j;
  16. }
  17. }
  18. if (minIndex != i) {
  19. System.out.println("++++++++");
  20. temp = array[minIndex];
  21. array[minIndex] = array[i];
  22. array[i] = temp;
  23. }
  24. }
  25. System.out.println(Arrays.toString(array));
  26. }
  27. }

三、插入排序

通过构建有序数列,对于未排序元素,在已排序数列中从后往前扫描,找到相应位置并插入。

1.将一个具有n个元素的待排序数列分成两个子数列,一个有序和一个无序。
2.刚开始,我们将左边第一个元素看成一个有序数列,右边n-1个元素看成无序数列。
3.从右边无序数列中取出一个元素,在已排序数列中从后往前扫描(比较),找到相应的位置并插入,使插入后有序数列仍然有序
4.重复第3步,直到完成整个排序过程。
插入排序.gif

  1. import java.util.Arrays;
  2. public class Innsertion {
  3. public static void main(String[] args) {
  4. int[] array = {2, 12, 4, 24, 3, 2, 34, 12, 33, 28, 23};
  5. if (array == null || array.length == 0) {
  6. return;
  7. }
  8. for (int i = 1; i < array.length; i++) {
  9. int temp = array[i];
  10. int index = i - 1;
  11. while (index >= 0 && array[index] > temp) {
  12. array[index + 1] = array[index];
  13. index--;
  14. }
  15. array[index + 1] = temp;
  16. }
  17. System.out.println(Arrays.toString(array));
  18. }
  19. }

三、希尔排序

又称缩小增量排序,是一种改进的排序算法,通常选择希尔增量gap=length/2,虽然这个增量不是最优的,但是很通用,普且自信(🐴)。

希尔排序.gif

  1. import java.util.Arrays;
  2. public class Shell {
  3. public static void main(String[] args) {
  4. int[] array = {2, 12, 4, 24, 3, 2, 34, 12, 33, 28, 23};
  5. int len = array.length;
  6. int gap = len / 2;
  7. while (gap > 0) {
  8. for (int i = gap; i < len; i++) {
  9. int temp = array[i];
  10. int index = i - gap;
  11. while (index >= 0 && array[index] > temp) {
  12. array[index + gap] = array[index];
  13. index -= gap;
  14. }
  15. array[index + gap] = temp;
  16. }
  17. gap /= 2;
  18. }
  19. System.out.println(Arrays.toString(array));
  20. }
  21. }