算法基础

2.1 插入排序

C++实现:

#include<iostream>
using namespace std;
 
void InsertSort(int arr[],int n)
{
    int i,j,key;
    for(i=1;i<n;++i)
    {
        key=arr[i];
        j=i-1;
        while(j>=0&&key<arr[j])
        {
            arr[j+1]=arr[j];
            j--;
        }
        arr[j+1]=key;
    }
}
 
int main()
{
    int arr[10]={14,25,53,23,2,6,74,34,67,39};
    InsertSort(arr,10);
    for(auto a:arr)
        cout<<a<<' ';
    cout<<endl;
}

2.3 分治法

合并操作代码

#include<iostream>
using namespace std;
 
void Merge(int arr[],int p,int q,int r)
{
    int i=0,j=0;
    int k;
    int n1=q-p+1;
    int n2=r-q;
    int temp[r-p+1];
    for(k=0;k<r-p+1;++k)
    {
        if(i<n1&&j<n2&&arr[p+i]<=arr[q+1+j])
        {
            temp[k]=arr[p+i];
            i++;
        }
        else if(i<n1&&j<n2&&arr[p+i]>arr[q+1+j])
        {
            temp[k]=arr[q+1+j];
            j++;
        }
        else if(i==n1||j==n2)
            break;
    }
    while(j<n2)
    {
        temp[k++]=arr[q+1+j];
        j++;
    }
    while(i<n1)
    {
        temp[k++]=arr[p+i];
        i++;
    }
    for(k=0;k<r-p+1;++k)
        cout<<temp[k]<<' ';
    cout<<endl;
}
 
int main()
{
    int arr[10]={1,6,9,12,56,2,31,45,67,78};
    Merge(arr,0,4,9);
}

2.3.1 合并排序

#include<iostream>
using namespace std;
void Merge(int arr[],int p,int q,int r);
void MergeSort(int arr[],int p,int r)
{
    int q;
    if(p < r) //只有一个或无记录时不须排序
    {
        q = (int)((p+r)/2);      //将data数组分成两半
        MergeSort(arr, p, q);   //递归拆分左数组
        MergeSort(arr, q+1, r); //递归拆分右数组
        Merge(arr, p, q, r);    //合并数组
    }
}
 
/*int main()
{
    int arr[10]={1,6,8,2,4,9,67,34,27,89};
    MergeSort(arr,0,9);
}*/
int main()
{
    int arr[10]={1,23,55,67,89,2,34,57,76,90};
    int k;
    for(k=0;k<10;++k)
    {
        cout<<arr[k]<<" ";
    }
    cout<<endl;
    MergeSort(arr,0,9);
    for(k=0;k<10;++k)
    {
        cout<<arr[k]<<" ";
    }
    cout<<endl;
}
 
void Merge(int arr[],int p,int q,int r)
{
    int i,j,k;
    int n1=q-p+1;
    int n2=r-q;
    int left[n1],right[n2];
    for(i=0; i<n1;i++)  //对左数组赋值
        left[i] = arr[p+i];
    for(j=0; j<n2;j++)  //对右数组赋值
        right[j] =arr[q+1+j];
    i=j=0;
    k=p;
    while(i<n1&&j<n2)
    {
        if(left[i]<=right[j])
        {
            arr[k++]=left[i++];
        }
        else
        {
            arr[k++]=right[j++];
        }
    }
    while(j<n2)
    {
        arr[k++]=right[j++];
    }
    while(i<n1)
    {
        arr[k++]=left[i++];
    }
}
 
或者
//Merge.cpp
#include<iostream>
using namespace std;
 
void Merge(int arr[],int p,int q,int r)
{
    int i=0,j=0;
    int k;
    int n1=q-p+1;
    int n2=r-q;
    int temp[r-p+1];
    for(k=0;k<r-p+1;++k)
    {
        if(i<n1&&j<n2&&arr[p+i]<=arr[q+1+j])
        {
            temp[k]=arr[p+i];
            i++;
        }
        else if(i<n1&&j<n2&&arr[p+i]>arr[q+1+j])
        {
            temp[k]=arr[q+1+j];
            j++;
        }
        else if(i==n1||j==n2)
            break;
    }
    while(j<n2)
    {
        temp[k++]=arr[q+1+j];
        j++;
    }
    while(i<n1)
    {
        temp[k++]=arr[p+i];
        i++;
    }
    for(k=0;k<r-p+1;++k)
        arr[p++]=temp[k];
}
 
//MergeSort.cpp
#include<iostream>
using namespace std;
void Merge(int arr[],int p,int q,int r);
void MergeSort(int arr[],int p,int r)
{
    int q;
    if(p < r) //只有一个或无记录时不须排序
    {
        q = ((p+r)/2);      //将data数组分成两半
        MergeSort(arr, p, q);   //递归拆分左数组
        MergeSort(arr, q+1, r); //递归拆分右数组
        Merge(arr, p, q, r);    //合并数组
    }
}
 
/*int main()
{
    int arr[10]={1,6,8,2,4,9,67,34,27,89};
    MergeSort(arr,0,9);
}*/
int main()
{
    int arr[10]={1,23,55,67,89,2,34,57,76,90};
    int k;
    for(k=0;k<10;++k)
    {
        cout<<arr[k]<<" ";
    }
    cout<<endl;
    MergeSort(arr,0,9);
    for(k=0;k<10;++k)
    {
        cout<<arr[k]<<" ";
    }
    cout<<endl;
}
原文地址:https://www.cnblogs.com/alantu2018/p/8461771.html