算法基础--排序

快速排序

基本思路:

确定左右边界,选一个数x,分区间:

左边都小于等于x,右边都大于等于x(注意!x不一定就在左右区间的交界点)

方法一(要空间)

扫描原数组q[],比x小的放在a[]数组,比x大的放在b[]数组,最后合并a,b

方法二(指针)

i扫描比x小的,满足就往后面走,直到不满足停下来

j扫描比x大的,满足就往前面走,直到不满足停下来

i和j交换

注意点:

1.因为是先移动再交换,所以i,j的边界要往两边扩充,保证第一个和最后一个能算进去

2.取x必须取(i+j)/2,不能上取整

3.while循环其实是按照交换来进行的,交换一次循环

#include<iostream>

using namespace std;
const int N=100010;

int q[N];
int n;

void quick_sort(int q[],int l,int r)
{
    if(l>=r)return;
    
    int x=q[(l+r)/2];
    int i=l-1,j=r+1;
    
    while(i<j)
    {
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j) swap(q[i],q[j]);
    }
    quick_sort(q,l,j);//i-1
    quick_sort(q,j+1,r);//i
}

int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&q[i]);
    
    quick_sort(q,0,n-1);
    
    for(int i=0;i<n;i++)
        printf("%d ",q[i]);
    
    return 0;
}

归并排序

1.先左右两个排好

2.把两个合并

3.把没加上的全放上去

#include<iostream>

using namespace std;

const int N=1000010;
int q[N],tmp[N];
void merge_sort(int q[],int l,int r)
{
    if(l>=r)return;
    
    int mid=(l+r)/2;
    
    merge_sort(q,l,mid);
    merge_sort(q,mid+1,r);
    
    int k=0,i=l,j=mid+1;
    while(i<=mid&&j<=r)
        if(q[i]<=q[j])tmp[k++]=q[i++];
        else tmp[k++]=q[j++];
        
    while(i<=mid)tmp[k++]=q[i++];
    while(j<=r)tmp[k++]=q[j++];
    
    for(int i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];
}

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++) scanf("%d",&q[i]);
    
    merge_sort(q,0,n-1);
    
    for(int i=0;i<n;i++)printf("%d ",q[i]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值