模板:(交换排序)
- for (int i = 0; i < ans.size()-1; i++) {//一共排序 n-1 轮,因为最后一个元素不需要比较
- for (int j = 0; j < ans.size() - i -1; j++) {
- //比较完i轮就是有i个数被排序,所以还剩n-i个数,-1变成下标(即不包含的右边界)
- if (ans[j] > ans[j + 1]) {//升序
- int temp = ans[j];
- ans[j] = ans[j + 1];
- ans[j + 1] = temp;
- }
- }
- }
时间复杂度:
特点:
适应场景:
模板:(交换排序)
视频链接:秒懂算法快速排序-动画4分钟精讲_哔哩哔哩_bilibili
- void quickSort(vector<int>& nums,int left,int right) {
- if (left >= right) return;//终止条件
- int midnum = nums[left];//选中基准值
- int i = left, j = right;
- while (i < j) {
- while (i
midnum) j--;//从右边界找到比基准值小的数 - if (i < j) {//比基准值小的数字插入左边槽中 移动左边界
- nums[i] = nums[j];
- i++;
- }
- while (i < j && nums[i] < midnum) i++;//从左边界找到比基准值大的数
- if (i < j) {//比基准值大的数子插入右边槽中 移动右边界
- nums[j] = nums[i];
- j--;
- }
- }
- nums[i] = midnum;//将基准值放入左边槽中
- quickSort(nums, left, i - 1);//将基准值左边的区间进行快排
- quickSort(nums, i + 1, right);
- }
时间复杂度:
特点:
适应场景:
- void heapify(vector<int>& arr, int size, int i)
- {
- int largest = i;
- int lson = 2 * i + 1;
- int rson = 2 * i + 2;
-
- if (lson < size && arr[largest] < arr[lson])
- largest = lson;
-
- if (rson < size && arr[largest] < arr[rson])
- largest = rson;
-
- if (largest != i)//当父节点不是最大值
- {
- swap(arr[i], arr[largest]);//把最大值和父节点值交换
- heapify(arr, size, largest);//维护下一层
- }
- }
-
- void heap_sort(vector<int>& arr)
- {
- int size = arr.size();
-
- // 建堆
- for (int i = size / 2 - 1; i >= 0; i--)
- heapify(arr, size, i);
-
- // 排序
- for (int i = size - 1; i > 0; i--)
- {
- swap(arr[0], arr[i]);
- heapify(arr, i, 0);
- }
- }
时间复杂度:
特点:
适用场景: