数据结构、刷leetcode返航版--二分5/7
1.排序
快排:
第一章 基础算法(一) - AcWing
如何调整范围
经典二分
递归结束条件;条件满足时,进行处理;递归左边,递归右边
分界点划分可以是l,r,(l+r)/2,但是如果是选l,比如是1,2排序,i最后结束循环是1,然后最后递归也是sort(q,0,0)
其实有太多问题:>=和>的选择,要不要判断i<j,递归使用i,i-1还是j,j+1【前一个超时了】,先这样吧,想不通。。。。。?????
模版:
void sort(vector<int>&nums,int l,int r){//感觉情况有点多啊
if(l>=r){
return;
}
int i = l-1;
int j = r+1;
int x = nums[(l+r)/2];
while(i<j){
do{
i++;
}while(nums[i]<x);//不是<=,如果=x应该让他放在中间
do{
j--;
} while(nums[j]>x);//不是<=
if(i<j) swap(nums[i],nums[j]);//必须i<j
}//i>=j j,i
sort(nums,l,i-1);
sort(nums,i,r);
}
#include<iostream>
#include<algorithm>
using namespace std;// 5
// 3 1 2 4 5
//
// void sort(vector<int>&nums,int l,int r){//二分
// if(l>=r){
// return;
// }// int i = l;
// int j = r;//两个指针
// int x = nums[(l+r)/2];//避免死循环
// cout<<"I:"<<i<<"j:"<<j<<endl<<"x"<<x;
// while(i<j){//
// while(nums[i]<=x){
// i++;// 可能导致 i 越界
// }
// while(nums[j]>=x){
// j--;// 可能导致 j 越界
// }
// swap(nums[i],nums[j]);// 交换后未移动指针
// }//结束:i>=j
// sort(nums,l,i-1);
// sort(nums,i,r);// }
void sort(vector<int>&nums,int l,int r){//感觉情况有点多啊if(l>=r){return;}int i = l-1;int j = r+1;int x = nums[(l+r)/2];while(i<j){do{i++;}while(nums[i]<x);//不是<=,如果=x应该让他放在中间// do { i++; } while (nums[i] < x); do{j--;} while(nums[j]>x);//不是<=if(i<j) swap(nums[i],nums[j]);//必须i<j}//i>=j j,isort(nums,l,i-1);sort(nums,i,r);
}int main(){int num;cin>>num;vector<int>vec(num);for(int i=0;i<num;i++){cin>>vec[i];// cout<<vec[i];}sort(vec,0,num-1);//num-1for(int s:vec){cout<<s<<" ";}
}
冒泡排序:
每一次把max数放到最后一位
void bubble_sort(int q[], int n) {
bool flag = true;
while (flag) {
flag = false;
for (int i = 1; i < n; i++) {
if (q[i] > q[i + 1]) {
flag = true;
int t = q[i];
q[i] = q[i + 1];
q[i + 1] = t;
}
}
}
}
2、搜索插入位置
手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
迷茫了11/49
---------------------------------------------