两个时间复杂度O(nlogn)排序算法:快排和归并排序

 

1.排序算法的几大分类 

     插入排序 

     交换排序

     选择排序

     归并排序

 

2.快速排序

一个无序数组,从左到右依次把每一个值放到合适的位置(在该数组排好序后的位置) 

关键是在怎么每次把一个元素放到合适的位置

肯定得递归

代码:

//
// Created by lpz on 2023/9/21.
//
#include "iostream"
using namespace std;

void QuickSort(int* R,int l,int r)
{
    int tmp;
    int s=l,t=r;
    //数组内至少有2个值
    if(s<t) {
        tmp = *(R + l);
        while (s != t) {
            while (t > s && *(R + t) >= tmp)
                t--;
            *(R + s) = *(R + t);
            while (s < t && *(R + s) <= tmp)
                s++;
            *(R + t) = *(R + s);
            
        }
        *(R + s) = tmp;
        QuickSort(R, l, s - 1);
        QuickSort(R, s + 1, r);
    }

}


int main()
{
    int data[]={6,8,7,9,0,1,3,2,4,5};
    QuickSort(data,0,9);
    for (int d:data)
        cout<<d<<endl;
    return 0;
}

3.归并排序

需要三个函数

void Merge(int* R,int l,int m,int r); 将数组中两个相邻的有序子序列归并为一个有序序列

void MergePass(int* R,int length,int n); 将数组从小到大分Length长的段

void MergeSort(int* R,int n);    数组逐步2倍的增加length

代码

//
// Created by lpz on 2023/9/21.
//
#include "iostream"
using namespace std;
void Merge(int* R,int l,int m,int r)
{
    int Rt[r-l+1];
    int i=l,j=m+1,k=0;
    while(i<=m&&j<=r)
    {
        if(R[i]<=R[j])
        {
            Rt[k]=R[i];
            i++;
        }
        else
        {
            Rt[k] = R[j];
            j++;
        }
        k++;
    }
    if(i<=m)
    {
        Rt[k]=R[i];
        i++;
        k++;
    }
    if(j<=r)
    {
        Rt[k]=R[j];
        j++;
        k++;
    }
    for(int i=l;i<=r;i++)
        R[i]=Rt[i-l];
}


void MergePass(int* R,int length,int n)
{
    int i;
    for(i=0;i+2*length-1<n;i+=2*length)
   {
        Merge(R,i,i+length-1,i+2*length-1);
   }
    if(i+length-1<n)
   {
        Merge(R,i,i+length-1,n-1);
   }

}

void MergeSort(int* R,int n){
    int len;
    for(len=1;len<n;len*=2)
    {
        MergePass(R,len,n);
        for (int i=0;i<n;i++)
            cout<<R[i]<<endl;
        cout<<"one"<<endl;
    }

}

int main()
{
    int data[]={18,2,20,34,12,32,6,16,1,5};
    MergeSort(data,10);

    for (int d:data)
        cout<<d<<endl;

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值