1047521767 发表于 2021-11-28 01:29

无C不行-废物一个-算法导论:C语言

                                            无C不行,废物一个,算法导论:C语言
直接插入排序法原理:从无序数列向左遍历,从有序数组向左比较
//插入排序法
void straightsort(int*arr,int len)
{
        int temp,i,j;
        for(i=1;i<len;i++)//将首元素看成有序数组,i=1表示从第二个元素开始排序
        {
                temp=arr;//temp存放待插入元素
                for(j=i-1;j>=0&&arr>temp;j--)//待插入元素向左比较,arr代表已经排序的有序数组,满足j>=0,且arr>temp
                {
                        arr=arr;//若条件成立,则将已排序数组向右移位,arr最大可达arr处,即temp处
                }
                arr=temp;//当循环不成立或循环终止,此时arr<=temp(或j=-1,所有有序数组都大于待排元素,)temp应位于arr处,j随temp左移而发生变化(减小)
        }
}

归并排序法将一个数组从中间分为两部分,再分别对两部分进行排序(递归),最后将排好序的两部分对比合并
//归并排序法
void merge_sort(float data[],int left,int right,float sorted_data[])
{
        if(left<right)//排除原数组出现只有一个数据的情况(left=right)
        {
                int mid=(left+right)/2;
                merge_sort(data,left,mid,sorted_data);
                merge_sort(data,min+1,right,sorted_data);
                merge_array(data,left,mid,right,sorted_data);
        }
}
void merge_array(float data[],int left,int mid,int right,float temp[])//data[]即待排子数组,直接用子数组排序,但将子数组分为两部分,temp[]即临时数组
{
        int i=left,j=mid+1;
        int k=0;
        while(i<=mid&&j<=right)//循环条件,将较小数组放入临时数组temp[]中,同时i变为data或j变为data
        {
                if(data<=data)
                {
                        temp=data;
                }
                else
                        temp=data;
        }
        while(i<=mid)//以下两个while代表可能出现的特殊情况:i/j所在数组已经全部完成排序,但另一数组仍有>=1的元素未放入临时数组中
                temp=data;
        while(j<=right)
                temp=data;
        for(i=0;i<k;i++)//将临时数组中的元素全部放入原数组中,k=right-left,k代表了数组长度
                data=temp;
}
void merge_array(float data[],int left,int mid,int right,float temp[])//哨兵简化
{
        int max_num=INT_MAX;
        int len=right-left+1;
        int data_left=new int ;
        int data_right=new int ;
        int i=0,j=0,k=0;
        for(int k=left;k<=mid;k++)
                data_left=data;
        data_left=max_num;
        for(int k=mid+i;k<=right;k++)
                data_right=data;
        data_right=max_num;
        for(int k=0;k<len;k++)
        {
                if(data_left<=data_right)
                        data=data_left;
                else
                        data=data_right;
        }
}


涂真锦 发表于 2021-11-29 17:54

收藏,必须收藏啊

1047521767 发表于 2021-11-30 11:13

涂真锦 发表于 2021-11-29 17:54 static/image/common/back.gif
收藏,必须收藏啊

点赞
页: [1]
查看完整版本: 无C不行-废物一个-算法导论:C语言