时间复杂度

image.png

比如:
T(n)=n+1 忽略常数项 T(n)~n
T(n)=n+n^2 忽略低阶项 T(n)~n^2
T(n)=3n 忽略最高阶的系数 T(n)~n

image.png

1.数字冒泡排序

  1. public class BubbleSort {
  2. public static void main(String[] args) {
  3. int[] arr = {1, 3, 4, 6, 8, 29, 0, 78, 78, 11};
  4. System.out.println("冒泡排序前的结果" + Arrays.toString(arr));
  5. bubbleSort(arr);
  6. }
  7. private static void bubbleSort(int[] arr) {
  8. if (arr == null || arr.length < 2) {
  9. return;
  10. }
  11. for (int i = 0; i < arr.length - 1; i++) {
  12. boolean flag = true;
  13. for (int j = 0; j < arr.length - 1 - i; j++) {
  14. if (arr[j] > arr[j + 1]) {
  15. flag = false;
  16. int temp;
  17. temp = arr[j];
  18. arr[j] = arr[j + 1];
  19. arr[j + 1] = temp;
  20. }
  21. }
  22. // 一趟下来是否发生位置交换
  23. if (flag) {
  24. break;
  25. }
  26. }
  27. System.out.println("冒泡排序后的结果" + Arrays.toString(arr));
  28. }
  29. }
  30. 结果
  31. 冒泡排序前的结果[1, 3, 4, 6, 8, 29, 0, 78, 78, 11]
  32. 冒泡排序后的结果[0, 1, 3, 4, 6, 8, 11, 29, 78, 78]

image.png

String字符串排序

自己写工具类

  1. public static void main(String[] args) {
  2. String[] arr = {"nba", "abc", "cha", "cba", "zz", "qq", "haha"};
  3. printArray(arr);
  4. System.out.println("---------------------------------");
  5. sortString(arr);
  6. printArray(arr);
  7. }
  8. private static void sortString(String[] arr) {
  9. for (int i = 0; i < arr.length; i++) {
  10. for (int j = i + 1; j < arr.length; j++) {
  11. // 字符串比较用compareTo方法
  12. if (arr[i].compareTo(arr[j]) > 0) {
  13. swap(arr, i, j);
  14. }
  15. }
  16. }
  17. }
  18. private static void swap(String[] arr, int i, int j) {
  19. String temp = arr[i];
  20. arr[i] = arr[j];
  21. arr[j] = temp;
  22. }
  23. private static void printArray(String[] arr) {
  24. System.out.print("[");
  25. for (int i = 0; i < arr.length; i++) {
  26. if (i != arr.length - 1) {
  27. System.out.print(arr[i] + ", ");
  28. } else {
  29. System.out.println(arr[i] + "]");
  30. }
  31. }
  32. }
  33. }
  34. 结果如下
  35. [nba, abc, cha, cba, zz, qq, haha]
  36. ---------------------------------
  37. [abc, cba, cha, haha, nba, qq, zz]
  1. public static String toString(Object[] a) {
  2. if (a == null)
  3. return "null";
  4. int iMax = a.length - 1;
  5. if (iMax == -1)
  6. return "[]";
  7. StringBuilder b = new StringBuilder();
  8. b.append('[');
  9. for (int i = 0; ; i++) {
  10. b.append(String.valueOf(a[i]));
  11. if (i == iMax)
  12. return b.append(']').toString();
  13. b.append(", ");
  14. }
  15. }

调用Arrays.toString方法

  1. public static String toString(int[] a) {
  2. if (a == null)
  3. return "null";
  4. int iMax = a.length - 1;
  5. if (iMax == -1)
  6. return "[]";
  7. StringBuilder b = new StringBuilder();
  8. b.append('[');
  9. for (int i = 0; ; i++) {
  10. b.append(a[i]);
  11. if (i == iMax)
  12. return b.append(']').toString();
  13. b.append(", ");
  14. }
  15. }

2.选择排序

场景
从众多苹果中挑了一个最大的装入袋子,然后又从剩下的苹果中挑出了最大的放入口袋

其实就是选择排序的思想,选择排序就是不断地从未排序的元素中选择最大(或最小)的元素放入已排好序的元素集合中,直到未排序中仅剩一个元素为止

我先从这些元素中选出一个最小的(或最大的),和第一个元素进行交换,这样第一个元素就是最小的,第一个元素位置就变成有序区间了

那如何选出最小的一个元素呢?
很容易想到:先随便选一个元素假设它为最小的元素(默认为无序区间第一个元素),然后让这个元素与无序区间中的每一个元素进行比较,如果遇到比自己小的元素,那更新最小值下标,直到把无序区间遍历完,那最后的最小值就是这个无序区间的最小值

代码demo

  1. public class SelectionSortDemo {
  2. public static void main(String[] args) {
  3. int[] arr = {1, 11, 1, 2, 3, 2, 3, 4, 6, 8, 2, 11};
  4. System.out.println("选择排序前的结果" + Arrays.toString(arr));
  5. selectionSort(arr);
  6. }
  7. private static void selectionSort(int[] arr) {
  8. for (int i = 0; i < arr.length; i++) {
  9. for (int j = arr.length - 1; j > i; j--) {
  10. if (arr[i] > arr[j]) {
  11. int temp;
  12. temp = arr[j];
  13. arr[j] = arr[i];
  14. arr[i] = temp;
  15. }
  16. }
  17. }
  18. System.out.println("选择排序后的结果" + Arrays.toString(arr));
  19. }
  20. }

demo2

  1. private static void selectionSort1(int[] arr) {
  2. for (int i = 0; i < arr.length - 1; i++) {
  3. int minIndex = i;
  4. for (int j = i + 1; j < arr.length; j++) {
  5. if (arr[j] < arr[minIndex]) {
  6. minIndex = j;
  7. }
  8. }
  9. int temp = arr[minIndex];
  10. arr[minIndex] = arr[i];
  11. arr[i] = temp; }
  12. System.out.println("选择排序后的结果" + Arrays.toString(arr));
  13. }

image.png

3.插入排序

场景
image.png
所谓直接插入排序,就是把未排序的元素一个一个地插入到有序的集合中插入,把有序集合从后向前扫一遍,找到合适的位置插入

  1. public static void main(String[] args) {
  2. int[] arr = {1, 3, 4, 6, 8, 2, 100};
  3. System.out.println("插入排序前的数组为" + Arrays.toString(arr));
  4. insertionSort(arr);
  5. }
  6. public static void insertionSort(int[] arr) {
  7. for (int i = 1; i < arr.length; i++) {
  8. // 将arr[i] 查放入到正确的位置
  9. inserToRightPosition(arr, i);
  10. }
  11. System.out.println("插入排序后的数组为" + Arrays.toString(arr));
  12. }
  13. private static void inserToRightPosition(int[] arr, int i) {
  14. // 备份待插元素
  15. int inserted = arr[i];
  16. int j = i - 1;
  17. for (; j >= 0 && arr[j] > inserted; j--) {
  18. arr[j + 1] = arr[j];
  19. }
  20. // 将待插元素插入正确的位置
  21. arr[j + 1] = inserted;
  22. }
  23. 执行结果
  24. 插入排序前的数组为[1, 3, 4, 6, 8, 2, 100]
  25. 插入排序后的数组为[1, 2, 3, 4, 6, 8, 100]

image.png