【基础算法】

一、基础算法

排序

快速排序

思想:(分治)
1、确定分界点:q[l],q[(l+r)/2],q[r],任意;
2*、调整区间
调整区间
3、递归处理左右两段

第二步的实现:
暴力
  1. 开a[],b[]两个数组;
  2. 扫描q[l,r]
if (q[i]<=x)
  q[i]--->a[]
if(q[i]>=x)
  q[i]-->b[]

3、先把 a[]-->q[],再把b[]--->q[].

优美

通过2个指针移动
1、q[i]>x,q[j]<x swap(q[i],q[j])
2、条件: i<j

伪代码
void  quick_sort(int q[],int l,int r)
// 出口
if(l>=r)
     return ;
// 1、确定分界点
int x=q[l],i=l-1,j=r+1;
// 2、调整区间
while(i<j){
do  i++ while(q[i]<x);
do j-- while(q[j]>x);
if(i<j) swap(q[i],q[j]);
}
// 3、递归处理两端
quick_sort(q,l,j);
quick_sort(q,j+1,r);
题目练习:

链接: 快速排序

归并排序

思想:
1、确定分界点:mid=(l+r)/2(这里有2种情况)
2、递归排序左右两边
3*、归并 合二为一,需要一个临时数组保存
合二为一

伪代码:
int temp[N];
void merge_sort(int q[],int l,int r){
//出口
if(l>=r) return ;
// 1、确定分界点
int mid =l+r>>1,k=0,i=l,j=mid+1;
// 2、递归排序左右两边
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
//  合二为一
while(i<=mid&&j<=r)
    if(q[i]<q[j]) temp[k++]=q[i++];
    else temp[k++]=q[j++];
}
while(i<=mid) temp[k++]=q[i++];
while(j<=r) temp[k++]=q[j++];
//把一段排好序的,再放回去
for(int i=l,k=0;i<=r;i++,k++){
      q[i]=q[k];
}
练习题目

链接: 归并排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值