算法 | 平均时间复杂度 | 空间复杂度 | 最坏情况 | 排序方式 | 稳定性 |
归并排序 | O(n log n) | O(n) | O(n log n) | 外 | 稳定 |
选择排序 | O(n^2) | O(1) | O(n log n) | 内 | 不稳定 |
堆排序 | O(n log n) | O(1) | O(n log n) | 内 | 不稳定 |
插入排序 | O(n^2) | O(1) | O(n^2) | 内 | 稳定 |
希尔排序 | O(n log^2 n) | O(1) | | 内 | 不稳定 |
快速排序 | O(n log n) | O(log n) | O(n^2) | 内 | 不稳定 |
冒泡排序 | O(n^2) | O(1) | O(n^2) | 内 | 稳定 |
基数排序k是关键字取值范围 | O(n) | O(k) | | 外 | 稳定 |
bool flag = true; for (int i = 1; i < zq.size(); ++i) //第一层循环,最多要冒泡数组个数-1次才能排完序 { flag = false; for (int j = 0; j < (zq.size() - i); ++j) //第二层循环,循环次数为数组总个数 - 第几个元素。 { if (zq[j + 1] < zq[j]) { flag = true; temp = zq[j + 1]; zq[j + 1] = zq[j]; zq[j] = temp; } } }
void quick_sort(vector<int>&zq, int left, int right) { if (left > right) return; int i = left + 1; int j = right; int temp = zq[left]; //界点 while (i <= j) { while (zq[i] < temp) i++; while (zq[j] > temp) j--; if (i < j) swap(zq[i++], zq[j--]); else i++; } swap(zq[j], zq[left]); //j就是界点应该的位置 quick_sort(zq,left,j-1); //界点左侧分治 quick_sort(zq,j+1,right);//界点右侧分治 }
void merge(vector<int>&zq, int low, int mid, int high) { //low为第一有序区第一元素,mid为第一有序区最后元素 int i = low, j = mid + 1,count=low; while (i <= mid && j <= high) { if (zq[i] <= zq[j]) result[count++] = zq[i++]; else result[count++] = zq[j++]; } while (i <= mid)//比较完后,第一区仍有剩余 result[count++] = zq[i++]; while (j <= high)//比较完后,第二区仍有剩余 result[count++] = zq[j++]; for (int i = low; i <= high; i++) zq[i] = result[i]; } void mergesort(vector<int>&zq,int low,int high) { if (low < high) { int mid = (low + high) / 2; mergesort(zq, low, mid); mergesort(zq, mid + 1, high); merge(zq, low, mid, high); } }