1 /* 2 * 排序:冒泡排序 3 * 平均时间复杂度:O(n*n) 4 * 最坏时间复杂度:O(n*n) 5 * 空间复杂度:O(1) 6 * 稳定性:稳定 7 * 思路:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 8 * 走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 9 * 每一次i的循环就是找到最小的那个数 10 * */ 11 void SortAlgorithm::bubbleSort(vector<int> A) { 12 int size = A.size(); 13 if (size < 2) { 14 return; 15 } 16 for (int i = 0; i < size - 1; i++) { 17 for (int j = i + 1; j < size; j++) { 18 if (A[i] > A[j]) { 19 swap(A[i], A[j]); 20 } 21 } 22 } 23 } 24 25 /* 26 * 排序:选择排序 27 * 平均时间复杂度:O(n*n) 28 * 最坏时间复杂度:O(n*n) 29 * 空间复杂度:O(1) 30 * 稳定性:不稳定 由于每次会有交换所以会导致不稳定 eg:4 2 4 1 第一次交换是第一个4和1交换 导致不稳定 31 * 思路:每一次找到最小的那个数 交换当前没有排序的最前面的位置 32 * */ 33 void SortAlgorithm::selectionSort(vector<int> A) { 34 int size = A.size(); 35 if (size < 2) { 36 return; 37 } 38 for (int i = 0; i < size - 1; i++) { 39 int indexMin = i; 40 for (int j = i + 1; j < size; j++) { 41 if (A[j] < A[indexMin]) { 42 indexMin = j; 43 } 44 } 45 if (i != indexMin) { 46 swap(A[indexMin], A[i]); 47 } 48 } 49 } 50 51 /* 52 * 排序:直接插入排序 53 * 平均时间复杂度:O(n*n) 54 * 最坏时间复杂度:O(n*n) 55 * 空间复杂度:O(1) 56 * 稳定性:稳定 57 * 思路: 插入排序就是后面的元素当成新的元素,插入已经排序好的序列里面 58 * */ 59 void SortAlgorithm::straightInsertionSort(vector<int> A) { 60 int size = A.size(); 61 if (size < 2) { 62 return; 63 } 64 for (int i = 1; i < size; i++) { 65 if (A[i - 1] > A[i]) { 66 int temp = A[i], j; 67 for (j = i - 1; j >= 0 && A[j] > temp; j--) { 68 A[j + 1] = A[j]; 69 } 70 A[j + 1] = temp; 71 } 72 } 73 } 74 75 /* 76 * 排序:快速排序 77 * 平均时间复杂度:O(nlogn) 78 * 最坏时间复杂度:O(n*n) 79 * 空间复杂度:0(logn) 80 * 稳定性:不稳定 81 * 思路:通过哨兵的操作 把数组分成 左右两个 把数组的左边的第一个数当成基数 然后从右边开始 右边找比基数小的数 左边找比基数大的数 82 * 在left<right的时候找到了就交换位置 最后交换左右碰面和基数的位置 就保证了基数左面的数一定小于基数 基数右边的数一定大于基数 83 * 然后递归 基数左边的 基数右边 84 * */ 85 void SortAlgorithm::quickSort(int a[], int low, int high) { 86 if (low >= high) { 87 return; 88 } 89 int first = low; 90 int last = high; 91 int key = a[first]; 92 93 while (first < last) { 94 while (first < last && a[last] >= key) { 95 --last; 96 } 97 a[first] = a[last]; 98 while (first < last && a[first] <= key) { 99 ++first; 100 } 101 a[last] = a[first]; 102 } 103 a[first] = key; 104 quickSort(a, low, first - 1); 105 quickSort(a, first + 1, high); 106 }