快排

归并排序是稳定算法(也就是说, 在值相等的情况下, 它们两个的顺序保持不变), 归并排序时, 在要将两个分开的数据合起来的时候, 要注意, 它选择开辟一个新的空间, 然后实现

快排思想:排序数据下标从a-p, 那么选择a-p之间的任意数据作为分区点, 将小于分区点的值放到左边, 大于分区点的值放到右边
快排的最坏情况时间复杂度是n^2, 最好是n, 平均是n*log(n)
快排的具体思想:
每一次分区也就是调用patition方法, 就确定一个数据的具***置, 在它的左边都是比它小的, 在它的右边都是比她大的

关键代码:

int partition(vector<int> &vec,int low,int high){ //传入的值是low和high, 而返回的值是vec[low]的值实际应该待的位置
int temp = vec[low]; //保存了low的值, 所以, 第一次用low的位置当作空闲位置, 当哨兵
while(low<high){ //一个大的循环
while(low<high && vec[high]>=temp){ //找到一个循环里, 第一个遇到的比vec[low]小的值, 把他放在low里面
high--;
}
vec[low]=vec[high]; //这里保存了high的值, 所以用high的位置当作空闲位置, 把他放到high里面
while(low<high && vec[low]<=temp){ //找到一个循环里, 第一个遇到的比它大值, 把它放到high里面
low++;
}
vec[high]=vec[low];
}
vec[low]=temp; //放好初始vec[low]应该放的位置
return low; //返回low最终的放置位置
}</int>

具体快排列调用:

int quicksort(vector<int> &vec,int low,int high){
if(low<high){
int mid = partition(vec,low,high); //将low位置的元素放到正确位置, 并返回low的正确位置值
quicksort(vec,low,mid-1); //排mid之前的数据
quicksort(vec,mid+1,high); //排mid之后的数据
}
}</int>

main函数里面:

int main(){
int len=20;
vector<int> vec;
for(int i=0;i<len;i++){
vec.push_back(rand());
}
quicksort(vec,0,len-1); //排序
for(int i=0;i<len;i++){
cout<<vec[i]<<endl;
}
}</int>

全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务