夯实基础——归并排序

逻辑结构:递归栈

物理结构:数组

归并排序分析:

最优时间复杂度:O(n)

最坏时间复杂度:O(nlog2n)

平均时间复杂度:O(nlog2n)

最差空间复杂度:O(n)

稳定性:稳定

归并排序主要有两个函数:

1 一次归并排序 int MergeArray(int *list1,int list1_size,int *list2,int list2_size);

2  递归归并排序 int MergeSort(int *list,int list_size);

3 非递归归并排序 int MergeSort(int *list,int list_size);

//一次归并排序
int MergeArray(int *list1,int list1_size,int *list2,int list2_size)
{
    int i,j,k,a;
    i=j=k=0;
    int *list=(int *)malloc(sizeof(int)*(list1_size+list2_size));
    while(i<list1_size && j<list2_size)
    {
        if(*(list1+i) <= *(list2+j))
        {
            *(list+k) = *(list1+i);
            i++;
            k++;
        }
        else
        {
            *(list+k) = *(list2+j);
            j++;
            k++;
        }
    }
    while(i < list1_size)
    {
        *(list+k) = *(list1+i);
        i++;
        k++;
    }
    while(j < list2_size)
    {
        *(list+k) = *(list2+j);
        j++;
        k++;
    }
    for(a=0;a<(list1_size+list2_size);a++)
        *(list1+a)=*(list+a);
    free(list);
}
//递归归并排序
int MergeSort(int *list,int list_size)
{
    if(list_size>1)
    {
        int *list1=list;
        int list1_size=list_size/2;
        int *list2=list+list_size/2;
        int list2_size=list_size-list1_size;
        MergeSort(list1,list1_size);
        MergeSort(list2,list2_size);

        MergeArray(list1,list1_size,list2,list2_size);
    }
}
//非递归归并排序
int NonMergeSort(int *list,int list_size)
{
    int i,l_min,l_max,r_min,r_max,cursor;
    int *aux = (int *)malloc(sizeof(int)*list_size);
    for( i = 1 ;i < list_size; i *= 2)
    {
        for(l_min = 0; l_min < list_size - i; l_min = r_max)
        {
                r_min = l_max = l_min + i ;
                r_max = l_max + i;

                if(r_max > list_size)
                    r_max = list_size;

                cursor = 0;

                while(l_min < l_max && r_min < r_max)
                {
                    if(list[l_min] <= list[r_min])
                    {
                        aux[cursor++] = list[l_min++];
                    }
                    else
                    {
                        aux[cursor++] = list[r_min++];
                    }
                }
                while(l_min < l_max)
                    aux[cursor++] = list[l_min++];
                while(r_min < r_max)
                    aux[cursor++] = list[r_min++];
                while( cursor > 0 )
                    list[--r_min] = aux [--cursor];
        }
    }
    free(aux);
}
//非递归归并排序
int NonMergeSort1(int *list , int length)
{

    int i, left_min, left_max, right_min, right_max, next;
    int *tmp = (int*)malloc(sizeof(int) * length);

    if (tmp == NULL)
    {
        fputs("Error: out of memory\n", stderr);
        abort();
    }

    for (i = 1; i < length; i *= 2)
    {
        for (left_min = 0; left_min < length - i; left_min = right_max)
        {
            right_min = left_max = left_min + i;
            right_max = left_max + i;

            if (right_max > length)
                right_max = length;

            next = 0;
            while (left_min < left_max && right_min < right_max)
                tmp[next++] = list[left_min] > list[right_min] ? list[right_min++] : list[left_min++];

            while (left_min < left_max)
                list[--right_min] = list[--left_max];

            while (next > 0)
                list[--right_min] = tmp[--next];
        }
    }

    free(tmp);
}

时间: 2024-11-05 19:30:19

夯实基础——归并排序的相关文章

夯实基础——快速排序

逻辑结构:递归栈 物理结构:数组 快速排序分析: 最优时间复杂度:O(nlog2n)在乱序情况下 最坏时间复杂度:O(n^2) 在顺序情况下 平均时间复杂度:O(nlog2n) 空间复杂度:O(n) 稳定性:不稳定 快速排序主要有两个函数: 1 一次划归 int partition(int a[],int low,int high); 2 递归快速排序 void QuickSort(int a[],int low,int high); 3 非递归快速排序 void NonQuickSort(in

夯实基础——堆排序

堆结构:任意的一个父节点大于其子节点. 逻辑结构:二叉树 物理结构:数组 如果从角标0开始 父节点左孩子节点:2*i+1 父节点右孩子节点:2*i+2 最后一个非叶节点:(n-1)/2 如果从角标1开始 父节点左孩子节点:2*i 父节点右孩子节点:2*i+1 最后一个非叶节点:n/2 堆排序分析: 最优时间复杂度:O(nlog2n) 最坏时间复杂度:O(nlog2n) 平均时间复杂度:O(nlog2n) 空间复杂度:O(1) 稳定性:不稳定 堆排序主要分三个函数: 1 调整成堆结构 void H

【夯实基础】Spring在ssh中的作用

尊重版权:http://blog.csdn.net/qjlsharp/archive/2009/03/21/4013255.aspx 写的真不错. 在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句.Struts是用来做应用层的,他它负责调用业务逻辑serivce层.所以SSH框架的流程大致是:Jsp页面----Struts------Service(业务逻辑处理类)

夯实基础——插入排序

物理结构:数组 插入排序分析: 最优时间复杂度:O(n) 顺序的情况下 最坏时间复杂度:O(n^2) 平均时间复杂度:O(n^2) 最坏空间复杂度:O(n) 辅助空间O(1) 稳定性:稳定 快速排序法函数: int InsertSort(int a[],int length); //插入排序 int InsertSort(int a[],int length) { int tmp,i,j; for(i=1;i<length;i++) { tmp=a[i]; j=i; while(j>0&

【夯实基础】java关键字synchronized 详解

尊重版权:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个sy

夯实基础

基础还不够牢靠,需要夯实基础: ------------------------------------------------------------------------------------------------------------------------------ 矩阵代数:@@@@@@ 数理统计:@@@@@@ 随机过程:@@@@ { 大数定理@@@ 中心极限定理@@@ 抽样分布@@@ 条件概率@@ 多元正态分布@@@@ 矩母函数@ 特征函数@ 独立增量过程@@@ 平稳过程@

JavaScript夯实基础--关于分号

和其他许多编程语言一样,JavaScript使用分号(;)将语句分隔开,这对增强代码的可读性一整洁性是非常重要的,缺少分隔符,一条语句的结束就成了下一条语句的开始,反之亦然.在JavaScript中,如果语句各自独占一行,通常可以省略语句之前的分号(程序结尾或右花括号之前的分号也可省略).不过关于JavaScript中可选的分号有几细节需要注意. JavaScript并不是在所有换行处都填补分号:只有在缺少分号就无法正确解析时,才会填补分号.换句话说,如果当前语句和随后的非空格字符不能当成一个整

夯实基础——P1615 西游记公司

题目链接:https://www.luogu.org/problem/P1615 P1615 西游记公司 题目背景 一道极其无厘头的题目 题目描述 事情是这样的:西游记中的孙沙猪(孙杀猪)三徒弟在西天取经之后开始进入厦门大学经贸系学习经济,在1个小时的学习后,他们用暴力手段毕业了.然后,他们创办了三个公司——“花果山生态旅游山庄集团公司”“高老庄猪肉美食城有限公司”“流沙河轮渡有限公司”.虽然这三家公司出自“经卷出版社”社长唐三藏的徒弟们,但是仍然保持着0元以下的财政收入.于是,他们想到了一个无

夯实基础——P2550 [AHOI2001]彩票摇奖

题目链接:https://www.luogu.org/problem/P2550 P2550 [AHOI2001]彩票摇奖 题目描述 为了丰富人民群众的生活.支持某些社会公益事业,北塔市设置了一项彩票.该彩票的规则是: (1) 每张彩票上印有 7 个各不相同的号码,且这些号码的取指范围为 1~33. (2) 每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码. (3) 共设置 7 个奖项,特等奖和一等奖至六等奖.兑奖规则如下: 特等奖:要求彩票上 7 个号码都出现在中奖号码中. 一等奖: