首页 > 其他分享 >归并排序

归并排序

时间:2022-12-19 16:11:55浏览次数:38  
标签:归并 排序 int 复杂度 include nlogn

归并排序

时间复杂度是 O(nlogn),空间复杂度是O(n)

#include <stdio.h>
#include <stdlib.h>

void printArray(int a[], int len)
{
    for(int i=0; i<len; ++i)
    {
        if(0==i)
            printf("[%d,",a[i]);
        else if(i < len-1)
            printf("%d,",a[i]);
        else
            printf("%d]\n",a[i]);
    }
}

//将 有序的数组 a、b 合并为一个有序的数组c。数组c要预先分配好内存。
void Merge2(int a[], int left1, int right1, int b[], int left2, int right2, int c[])
{
    int i = left1, j = left2, k = 0;
    for(k = 0; i <= right1 && j <= right2; ++k){
        if(a[i] <= b[j])
            c[k] = a[i++];
        else
            c[k] = b[j++];
    }
    while(i <= right1)
        c[k++] = a[i++];
    while(j <= right2)
        c[k++] = b[j++];
}

//将分别有序的data[s..m] 和 data[m+1 .. n] 归并为有序的 data[s..n]
void Merge(int data[], int s, int m, int n){
    int i, start = s, k=0;
    int *temp = (int*) malloc((n-s+1)*sizeof(int));
    for(i=m+1; s<=m && i<=n; ++k){
        if( data[s] <= data[i] ) 
            temp[k]=data[s++];
        else
            temp[k] = data[i++];
    }
    for(; s<=m; ++k)
        temp[k] = data[s++];
    for(; i<=n; ++k)
        temp[k] = data[i++];
    
    //拷贝 temp 到 data里
    for(i=0; i<k; ++i){
        data[start++] = temp[i];
    }
    free(temp);
}

void MSort(int data[], int left, int right){
    if(left < right){
        int mid = left + (right-left)/2;
        MSort(data, left, mid);
        MSort(data, mid+1, right);
        Merge(data, left, mid, right);
    }
}

int main(){
    //int a[] = {4,10,55,5,22,32,72,113};
    //int len = sizeof(a)/sizeof(a[0]);
    //int m = 2;
    //printArray(a,len);
    //Merge(a,0,m,len-1);
    //printArray(a,len);
    
    // int a[] = {1,2,3,4,9,15,16,21,45};
    // int b[] = {3,5,6,7,11,17,18,200};
    // int aLen = sizeof(a)/sizeof(a[0]);
    // int bLen = sizeof(b)/sizeof(b[0]);
    // int len = aLen+bLen;
    // int *res = (int*) malloc(len*sizeof(int));
    // Merge2(a,0,aLen-1,b,0,bLen-1, res);
    // printArray(res,len);
    // free(res);
    
    // int a[] = {4,10,55,5,22,32,72,113,200};
    // int len = sizeof(a)/sizeof(a[0]);
    // int m = 2;
    // printArray(a,len);
    // int res[100] = {0};
    // Merge2(a,0,m,a,m+1,len-1,res);
    // printArray(res,len);
    
    int a[]={3,7,9,2,1,0,15,10};
    int len = sizeof(a)/sizeof(a[0]);
    printArray(a,len);
    MSort(a,0,len-1);
    printArray(a,len);
    return 0;
}
View Code

 

--

标签:归并,排序,int,复杂度,include,nlogn
From: https://www.cnblogs.com/htj10/p/16992411.html

相关文章

  • List<Map<String,Object>> allList = new ArrayList<>(); 针对Object进行 List 排序
    List<Map<String,Object>>allList=newArrayList<>();Collections.sort(allList,newComparator<Map<String,Object>>(){publicintcompare(Map<String,Objec......
  • SQL基础——聚合与排序
    聚合与排序​​前言​​​​思维导图​​​​聚合函数​​​​示例表3-1​​计算表中数据的行数COUNT函数​​​​示例代码3.1计算全部数据的行数​​​​执行结果​​​......
  • 【算法实践】有始有终,雨露均沾--手把手带你手撸选择排序
    前言选择排序是一个非常经典且简单直观的排序算法,无论什么数据进去都是O(n^2)的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间......
  • ES6中对数组的数据进行排序
    今天在工作中遇到了要对多选数据进行排序的一个功能,在此学习记录一下。实现效果:点击左边的向下或者向上排序的按钮实现数据的排序。选择第二个向下排序,结果如下:  ......
  • JavaScript冒泡排序+Vue可视化冒泡动画
    冒泡排序(BubbleSort)算是前端最简单的算法,也是最经典的排序算法了。网上JavaScript版本的冒泡排序很多,今天用Vue实现一个动态的可视化冒泡排序。01、JavaScript冒泡排序......
  • 图——拓扑排序
    拓扑排序定义给定一个包含n个节点的有向图 G,我们给出它的节点编号的一种排列,如果满足:对于图G中的任意一条有向边(u,v),u在排列中都出现在v的前面。那么称该排......
  • 冒泡排序相关知识总结
    轮数表示冒泡排序外层循环的次数,次数表示交换次数。设排列为\(w\),冒泡排序的轮数为\(\max_{i=1}^{n}(i-w_i)\).因为如果\(i>w_i\),那么这个数每一轮会向目的地......
  • 【算法实践】手把手带你快速实现插入排序
    前言每学习一个新东西总要首先知道他是什么,能做什么,怎么做,类似于哲学中的三大问题:我是谁,从哪里来,要到哪里去。或许我们一直徘徊在哲学的迷思中,也许一直想不明白,但是在思考的......
  • 插入排序优化
    defselection_sort(alist):n=len(alist)#需要进行n-1次选择操作a=0foriinrange(n-1):#记录最小位置min_index=i......
  • #yyds干货盘点# LeetCode程序员面试金典:栈排序
    题目:栈排序。编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek......