O(n^2)级别的算法主要包括:选择排序,插入排序,冒泡法排序,希尔排序等
选择排序:选择排序,将后面未排序数组中最小的与前面的元素交换
1 template <typename T> 2 void selectionSort(T arr[], int n) { 3 for (int i = 0; i < n; i++) { 4 int minIndex = i; 5 for (int j = i + 1; j < n; j++) { 6 if (arr[j] < arr[minIndex]) 7 minIndex = j; 8 } 9 10 swap(arr[i], arr[minIndex]); 11 } 12 }
插入排序,选择前面数组已经排好序的部分合适的插入位置
1 template <typename T> 2 void insertionSort1(T arr[], int n) { 3 for (int i = 1; i < n; i++) { 4 T e = arr[i]; 5 int j; 6 for (j = i; j > 0 && arr[j - 1]>e; j--) {//从后往前找合适位置插入 7 arr[j] = arr[j - 1]; 8 } 9 arr[j] = e; 10 } 11 } 12 // 对arr[l...r]范围的数组进行插入排序 13 template<typename T> 14 void insertionSort(T arr[], int l, int r) { 15 16 for (int i = l + 1; i <= r; i++) { 17 18 T e = arr[i]; 19 int j; 20 for (j = i; j > l && arr[j - 1] > e; j--) 21 arr[j] = arr[j - 1]; 22 arr[j] = e; 23 } 24 25 return; 26 }
冒泡法:每次循环将最大的放到挤出到后面位置
1 template <typename T> 2 void bubbleSort(T arr[], int n) { 3 for (int i = 0; i < n - 1; i++) { 4 for (int j = 0; j < n - i - 1; j++) { 5 if (arr[j + 1] < arr[j]) { 6 swap(arr[j + 1], arr[j]);//非常耗时 7 } 8 } 9 } 10 }
//希尔排序 template<typename T> void shellSort(T arr[], int n) { // 计算 increment sequence: 1, 4, 13, 40, 121, 364, 1093... int h = 1; while (h < n / 3) h = 3 * h + 1; while (h >= 1) { // h-sort the array for (int i = h; i < n; i++) { // 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序 T e = arr[i]; int j; for (j = i; j >= h && e < arr[j - h]; j -= h) arr[j] = arr[j - h]; arr[j] = e; } h /= 3; } }