1、插入排序

#include<iostream> #include<vector> using namespace std; void InsertSort(vector<int>& vec) { for (int i = 0; i < vec.size()-1; i++) { int end = i;//记录有序序列最后一个元素下标 int index = vec[i + 1];//本轮要插入的元素 while (end >= 0) {//每轮最多查找end次 if (index < vec[end]) {//小于,前移 vec[end + 1] = vec[end]; end--; } else break;//不小于,不动 } vec[end + 1] = index; } } int main() { vector<int> vec; int num = 0; while (cin >> num) { vec.push_back(num); if (getchar() == '\n') break; } int left = 0, right = vec.size() - 1; InsertSort(vec); for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } }
快排
双指针法:
#include<iostream> #include<vector> using namespace std; void QuickSort(vector<int>& vec, int left, int right) { if (left >= right) return; int index = left;//标记选定值 int left1 = left, right1 = right; while (left1 < right1) { //选定最左的数据为标准值,则right先走,选定最右的数据作为基准值,则需要left先走 //右边大于选定值,不需要移动 while (vec[right1] >= vec[index] && left1 < right1) { right1--; } //用的是while,不满足时跳出 //左边小于选定值,不需要移动 while(vec[left1] <= vec[index] && left1 < right1) { left1++; } swap(vec[left1], vec[right1]); } //把选定值移动到中间 swap(vec[index], vec[right1]); index = right1; QuickSort(vec, left, index - 1); QuickSort(vec, index + 1, right); } int main() { vector<int> vec; int num = 0; while (cin >> num) { vec.push_back(num); if (getchar() == '\n') break; } int left = 0, right = vec.size() - 1; QuickSort(vec, left, right); for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } }
时间复杂度:O(nlogn),类似于一个二叉树,二叉树高度为logn,每一层约有N个数
空间复杂度:O(1)