基础排序算法

快排——双指针

左右指针:left right

左开始找大的,右开始找小的。大--> <--小

l,r没有相遇,swap

l,r相遇,swap返回left

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int q[N]; //开辟数组空间 
void quick_sort(int q[],int l,int r){
    if(l>=r)return;//排除只有一个数或没有数的情况 
    int i=l-1,j=r+1;//向外扩展一格
    int stand=q[(l+r)>>1];//取中间数为基准数 ,右移一位等于÷2//找中间数的下标
    //while   do while循环排序 
    //左边i开始找大的,右边j开始找小的 
    while(i<j)
    {
        do i++;while(q[i]<stand);//直到找到大的 
        do j--;while(q[j]>stand);//直到找到小的 
        if(i<j)swap(q[i],q[j]); //没有找到就交换
     } 
     quick_sort(q,l,j);//递归处理左右两端
     quick_sort(q,j+1,r); 
}
int main(){
    int n;
    cin>>n;//输入要排的有几个
    for(int i=0;i<n;i++)
    {
        cin>>q[i];//输入待排数列
     } 
     quick_sort(q,0,n-1);//带入快排函数
     for(int i=0;i<n;i++)
     {
         cout<<q[i]<<" ";
      } 
    return 0;
} 

归并排序

思想:

先找一个中间点,mid =(l+r)/2 分为左边和右边;

递归排序left ,right

归并:把两个有序的数组合并成一个有序的数列

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int a[N]; //开辟数组空间 
int temp[N];//暂存空间 
void merge_sort(int a[],int l,int r)
{
    if(l>=r)return;//排除只有一个数或没有数的情况 
    int mid= l+r >> 1;
    //递归排序 
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r); 
    
    //把两个有序序列,归并成一个有序序列 
    int k=0;//k表示要合并几个数 
    int i=l,j=mid+1;//i指向左边数组的起点,j指向右边数组的起点。依次查找右边的数组排序,与左边的数组合并一起
    while(i<=mid&&j<=r){//条件:i<左边边界,j<右边边界 
    //判断大小 ,每次把小的先放到temp中 
        if(a[i]<=a[j]) temp[k++]=a[i++];//把左边拿过来
         else temp[k++]=a[j++];// 把右边拿过来
    } 
    //把剩下没有循环完的拿下来,可能左边,也可能右边
    //所以判断一下剩余的没有循环完的,直接拿到答案里去 
    while(i<=mid)  temp[k++]=a[i++];
    while(j<=r) temp[k++]=a[j++];
    
    //把结果拿回来,从temp里复制
    for(i=l,j=0;i<=r;i++,j++) a[i]=temp[j]; 
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
     } 
     merge_sort(a,0,n-1);//带入归并函数
     for(int i=0;i<n;i++)
     {
         cout<<a[i]<<" ";
      } 
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值