# Ch8
# 冒泡排序
直接看代码
bubbleSort 1 2 3 4 5 6 7 8 9 10 void bubbleSort (int a[], int n) { for (int i = 0 ; i < n - 1 ; i++) { for (int j = 0 ; j < n - i - 1 ; j++) { if (a[j] > a[j + 1 ]){ swap (a[j], a[j + 1 ]); } } } return ; }
时间复杂度O ( n 2 ) O(n^2) O ( n 2 ) ,空间复杂度O ( 1 ) O(1) O ( 1 )
# 选择排序
每次找最小的和循环的第一个元素交换
selectionSort 1 2 3 4 5 6 7 8 9 10 11 void selectionSort (int a[], int n) { for (int i = 0l i < n; i++){ int min_index = i; for (int j = i; j < n; j++){ if (a[j] < a[min_index]){ min_index = j; } } swap (a[i], a[min_index]); } }
时间复杂度O ( n 2 ) O(n^2) O ( n 2 ) ,空间复杂度O ( 1 ) O(1) O ( 1 )
# 插入排序
将列表分为已排序部分和未排序部分。初始时,已排序部分只包含第一个元素,未排序部分包含剩余元素,从未排序部分中取出第一个元素,插入已排序部分合适位置。
insertionSort 1 2 3 4 5 6 7 8 9 10 11 void insertionSort (int a[], int n) { for (int i = 1 ; i < n; i++){ int j = i; int key = a[i]; while (j > 0 && key < a[j - 1 ]){ a[j] = a[j - 1 ]; j--; } a[j] = key; } }
时间复杂度O ( n 2 ) O(n^2) O ( n 2 ) ,空间复杂度O ( 1 ) O(1) O ( 1 )
# 希尔排序
将待排序的列表分成若干子列表,对每个子列表进行插入排序,逐步缩小子列表的间隔,常见的增量序列有希尔增量(n/2, n/4, …, 1)
shellSort 1 2 3 4 5 6 7 8 9 10 11 12 13 void shellSort (int a[], int n) { for (int gap = n / 2 ; gap > 0 ; gap /= 2 ){ for (int i = gap; i < n; i++){ int j = i; int key = a[i]; while (j >= gap && key < a[j - gap]){ a[j] = a[j - gap]; j -= gap; } a[j] = key; } } }
best time complexityO ( n l o g n ) O(nlog_n) O ( n l o g n ) , worst time complexityO ( n 2 ) O(n^2) O ( n 2 ) ,空间复杂度O ( 1 ) O(1) O ( 1 )
# 归并排序
每次分成两半,像把两个有序链表合并成一个有序链表一样,将两个有序的子序列合并成一个有序的序列,然后递归处理每个子序列,直到处理完所有元素
mergeSort 1 2 3 void mergeSort (int &a[], int left, int right) {}
时间复杂度O ( n l o g n ) O(nlog_n) O ( n l o g n ) , 空间复杂度O ( n ) O(n) O ( n )
# 快速排序
从列表中选择一个元素作为基准(pivot)。选择方式可以是第一个元素、最后一个元素、中间元素或随机元素,使得所有小于基准元素的元素都在基准的左侧,所有大于基准元素的元素都在基准的右侧
选择 pivot
分割列表:把小于 pivot 的元素放在 pivot 的左侧,大于 pivot 的元素放在 pivot 的右侧,最终 pivot 的位置是正确的
递归处理
quickSort 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 void quickSort (int a[], int left, int right) { if (left >= right) return ; int pivot = a[(left + right) / 2 ]; int i = left, j = right; while (i <= j) { while (a[i] < pivot) i++; while (a[j] > pivot) j--; if (i <= j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j--; } } quickSort (a, left, j); quickSort (a, i, right); }
时间复杂度O ( n l o g n ) O(nlog_n) O ( n l o g n ) , 空间复杂度O ( l o g n ) O(log_n) O ( l o g n )
# 堆排序
建立一个堆,让它自己排序(shift_down 和 shift_up)
最大堆用于升序排序,最小堆用于降序排序
heapSort 1 void heapSort (int a[], int n) {}
时间复杂度O ( n l o g n ) O(nlog_n) O ( n l o g n ) , 空间复杂度O ( n ) O(n) O ( n )
# 桶排序
将数据分到若干个桶中,每个桶再进行排序,最后将各个桶的元素合并
bucketSort 1 2 3 void bucketSort (int a[], int n) {}
时间复杂度O ( n + k ) O(n+k) O ( n + k ) , 空间复杂度O ( n + k ) O(n+k) O ( n + k )