【day-16】C++各种排序
来源:互联网 发布:且听风吟 朴树 知乎 编辑:程序博客网 时间:2024/05/17 18:12
#include <iostream>#include <vector>using namespace std;/*TODO:直接插入排序 时间复杂度O(n^2) 最好情况:有序,O(n) 最差情况:到序,O(n^2) 空间复杂度O(1) 稳定性 稳定 */vector<int> straightInsertionSort(vector<int> array) { int size = array.size(); for (int i = 1; i < size; i++) { int j = i - 1; int temp = array[i]; while (j >= 0 && array[j] > temp) { array[j + 1] = array[j]; j--; } array[j + 1] = temp; } return array;}/*TODO:希尔排序 时间复杂度 与希尔增量有关系 空间复杂度O(1) 稳定性 不稳定 */vector<int> shellSort(vector<int> array) { int size = array.size(); int step = size / 2; while (step > 0) { for (int i = step; i < size; i++) { int j = i - step; int temp = array[i]; while (j >= 0 && array[j] > temp) { array[j + step] = array[j]; j = j - step; } array[j + step] = temp; } step = step / 2; } return array;}/*TODO:简单选择排序 时间复杂度O(n^2) 最好情况:有序,O(n^2) 最差情况:到序,O(n^2) 空间复杂度O(1) 稳定性 不稳定 */vector<int> selectSort(vector<int> array) { int size = array.size(); for (int i = 0; i < size; i++) { int k = i; for (int j = i + 1; j < size; j++) { if (array[j] < array[k]) { k = j; } } if (k != i) { swap(array[i], array[k]); } } return array;}/*TODO:堆排序 时间复杂度O(nlgn) 最好情况:O(nlgn) 最差情况:O(nlgn) 空间复杂度O(1) 稳定性 不稳定 */void heapBuild(vector<int> &array, int root, int size) { int l = 2 * root + 1; int m = l; if (l < size) { int r = l + 1; if (r < size && array[r] > array[l]) { m = r; } if (array[m] > array[root]) { swap(array[m], array[root]); heapBuild(array, m, size); } }}vector<int> heapSort(vector<int> array) { int size = array.size(); for (int i = size / 2 - 1; i >= 0; i--) { heapBuild(array, i, size); } for (int last = size - 1; last > 0; last--) { swap(array[0], array[last]); heapBuild(array, 0, last); } return array;}/*TODO:冒泡排序 时间复杂度O(n^2) 最好情况:有序,O(n) 最差情况:到序,O(n^2) 空间复杂度O(1) 稳定性 稳定 */vector<int> bubbleSort(vector<int> array) { int size = array.size(); for (int i = 0; i < size - 1; i++) { bool exchangeFlag = false; for (int j = 0; j < size - 1 - i; j++) { if (array[j] > array[j + 1]) { swap(array[j], array[j + 1]); exchangeFlag= true; } } if(!exchangeFlag){ break; } } return array;}/*TODO:快速排序 时间复杂度O(n*logn) 最好情况:划分得很均匀,O(n*logn) 最差情况:当待排序的序列为正序或逆序排列时,且每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空,O(n^2) 空间复杂度O(1) 稳定性 稳定 */void quickSort(vector<int> &array, int start, int end) { if (start >= end) { return; } int first = start; int last = end; int key = array[first]; while (last > first) { while (last > first && array[last] >= key) { last--; } array[first] = array[last]; while (last > first && array[first] <= key) { first++; } array[last] = array[first]; } array[first] = key; quickSort(array, start, first - 1); quickSort(array, first + 1, end); return;}/*TODO:归并排序 时间复杂度O(nlogn) 最好情况:O(nlogn) 最差情况:O(nlogn) 空间复杂度O(n) 稳定性 稳定 */void merge(vector<int> &array, vector<int> &arrayTemp, int start, int mid, int end) { int i = start; int j = mid + 1; int k = start; while (i <= mid && j <= end) { if (array[i] < array[j]) { arrayTemp[k++] = array[i++]; } else { arrayTemp[k++] = array[j++]; } } while (i <= mid)arrayTemp[k++] = array[i++]; while (j <= end)arrayTemp[k++] = array[j++]; for (int i = start; i <= end; i++) { array[i] = arrayTemp[i]; }}void mergeSort(vector<int> &array, vector<int> &arrayTemp, int start, int end) { if (end > start) { int mid = (start + end) / 2; mergeSort(array, arrayTemp, start, mid); mergeSort(array, arrayTemp, mid + 1, end); merge(array, arrayTemp, start, mid, end); }}/*TODO:基数排序 稳定性 稳定 r:关键字的基数,d代表长度,n代表关键字的个数 */int maxNumOfDigital(vector<int> array) { int size = array.size(); int num = 1; int radix = 10; for (int i = 0; i < size; i++) { while (array[i] >= radix) { radix *= 10; num++; } } return num;}void radixSort(vector<int> &array) { int size = array.size(); int num = maxNumOfDigital(array); vector<int> temp(size), bucket(10); int radix = 1; for (int i = 0; i <num; i++) { for (int j = 0; j < 10; j++) { bucket[j] = 0; } for (int j = 0; j < size; j++) { int k = (array[j] / radix) % 10; bucket[k]++; } for (int j = 1; j < 10; j++) { bucket[j] = bucket[j] + bucket[j - 1]; } //TODO:一定要是倒过来装进去!!! for (int j = size-1; j >= 0; j--) { int k = (array[j] / radix) % 10; temp[bucket[k] - 1] = array[j]; bucket[k]--; } for (int j = 0; j < size; j++) { array[j] = temp[j]; } radix *= 10; }}void print(string str, vector<int> input) { cout << str << ":"; for (auto it = input.begin(); it != input.end(); it++) { cout << *it << " "; } cout << endl;}int main() { vector<int> array{22, 44, 33, 1, 44, 3, 100, 11, 33}; vector<int> res; res = straightInsertionSort(array); print("直接插入", res); res = shellSort(array); print("希尔排序", res); res = selectSort(array); print("选择排序", res); res = heapSort(array); print("堆 排 序", res); res = bubbleSort(array); print("冒泡排序", res); vector<int> arrayTemp = array; quickSort(arrayTemp, 0, arrayTemp.size() - 1); print("快速排序", res); arrayTemp = array; vector<int> arrayTemp2(array.size()); mergeSort(arrayTemp, arrayTemp2, 0, arrayTemp.size() - 1); print("归并排序", res); arrayTemp = array; radixSort(arrayTemp); print("基数排序", arrayTemp); return 0;}
阅读全文
1 0
- 【day-16】C++各种排序
- 【day-15】golang各种排序
- C各种排序
- c/c++各种排序
- [C++]各种排序方法
- C/C++各种排序法
- 各种排序算法 C语言版
- c语言实现各种排序
- 各种排序算法--C 转载
- 各种排序c语言实现
- C语言各种排序算法
- c实现的各种排序
- 总结各种排序算法(C++)
- C语言各种排序算法
- c/c++各种排序算法
- #Objective - C - sixth-Day 数组排序及集合遍历
- #Objective - C - sixth-Day OC小练习 省市区排序
- 各种排序方法的C语言实现
- angular4后台管理系统搭建过程总结
- Thumbnails 处理图片
- Linux 查看日志文件命令
- 主机静态路由添加
- 解决新版Qt中不能使用opengl中gluXXX()函数的方法
- 【day-16】C++各种排序
- 小试身手(Java选择题)
- codility MinAvgTwoSlice
- table-layout属性fixed和auto的区别
- JavaScript 中对象的 constructor 属性的作用是什么?
- webpack
- 内存里创建了____个CSomething对象
- Python爬虫实现爬取糗事百科
- NLP|Skip-Gram模型介绍(讲解十分详细)