码迷,mamicode.com
首页 > 其他好文 > 详细

第二章

时间:2019-09-26 21:10:46      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:++   while   name   插入排序   输入   双指针   namespace   cin   include   

INSERT_SORT插入排序:

适用于少量元素,

给定序列为长度为n的arr序列,无序

以x为例,在arr序列中找到一个左边小于等于x,右边大于等于x的位置

技术图片
#include<bits/stdc++.h>
using namespace std;
int arr[100000];
int n;
void insert_sort()//插入排序
{
    for (int i=1;i<n;i++)
    {
        int key=arr[i];
        int j=i-1;
        while(i>0&&arr[j]>key)
        {
            arr[j+1]=arr[j];
            j=j-1;
        }
        arr[j+1]=key;
    }
}
void out()//输出
{
    for(int i=0;i<n;i++)
        cout<<arr[i]<< ;
}
int main()
{

    cout<<"输入arr序列长度n:";
    cin>>n;
    cout<<"输入arr序列:";
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    insert_sort();
    cout<<"输出insert_sort后arr序列";
    out();
     return 0;
}
INSERT_SORT

 算法分析:

时间分析:每一句代码为o(1)的时间,调用语言内的函数,按其底层时间计算,循环为循环层数乘以每个循环中代码个数

空间分析:所调用或申请的空间计算

分治:
将一个大问题分解成若干小问题进行求解,然后再合并得到大问题的解

MERG_SORT归并排序:

归并操作:给定有序序列L1[1.....n],L2[1......m],归并生成L3[1.....m+n]

建立双指针操作

技术图片
#include<bits/stdc++.h>
using namespace std;
int L1[100000];
int L2[100000];
int L3[100000];
int n,m;
void merge_()
{
    L1[n]=999999999;
    L2[m]=999999999;
    int i=0,j=0;
    for(int k=0;k<m+n;k++)
    {
        if(L1[i]<L2[j])
        {
            L3[k]=L1[i];
            i++;
        }
        else
        {
            L3[k]=L2[j];
            j++;
        }
    }
}
void out()
{
    for(int i=0;i<m+n;i++)
    {
        cout<<L3[i]<< ;
    }
}
int main()
{
    cout<<"序列L1的长度n:";
    cin>>n;
    cout<<"序列L2的长度m:";
    cin>>m;
    cout<<"输入序列L1:";
for(int i=0;i<n;i++)
cin>>L1[i];
cout<<"输入序列L2:";
for(int i=0;i<m;i++)
    cin>>L2[i];
merge_();
cout<<"输出归并排序后的L3序列:";
out();
}

MERGR
MERGR

排序操作:将序列进行分治,分解成最小单元的小问题,再进行归并,然后合并得到所要求排序序列

给定长度为n的无序序列arr序列

技术图片
#include<bits/stdc++.h>
using namespace std;
int arr[1000000];
int n;
int L[100000];//辅助数组
int R[100000];//辅助数组
void merge_(int l,int m,int r)
{
    for(int i=0;i<m-l+1;i++)
        L[i]=arr[l+i];
    for(int i=0;i<r-m;i++)
        R[i]=arr[m+i+1];
    L[m-l+1]=99999999;
    R[r-m]=99999999;
    int i=0,j=0;
    for(int k=l;k<=r;k++)
    {
        if(L[i]<R[j])
            arr[k]=L[i],i++;
        else
            arr[k]=R[j],j++;
    }
}
void merge_sort(int l,int r)
{
    if(l<r)
    {
        int mid=(l+r)/2;
        merge_sort(l,mid);
        merge_sort(mid+1,r);
        merge_(l,mid,r);
    }
}
void out()
{
    for(int i=0;i<n;i++)
        cout<<arr[i]<< ;
}
int main()
{
    cout<<"输入序列arr的长度n:";
    cin>>n;
    cout<<"输入序列arr:";
    for(int i=0;i<n;i++)
        cin>>arr[i];
    merge_sort(0,n-1);
    cout<<"输出序列arr:";
    out();
}
MERGR_SORT

 

 

 

第二章

标签:++   while   name   插入排序   输入   双指针   namespace   cin   include   

原文地址:https://www.cnblogs.com/RE-TLE/p/11593845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!