C/C++知识点之[C语言] 归并排序的特性及实现
小标 2018-10-10 来源 : 阅读 1608 评论 0

摘要:本文主要向大家介绍C/C++知识点之[C语言] 归并排序的特性及实现了,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍C/C++知识点之[C语言] 归并排序的特性及实现了,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

1、算法特性
  归并排序是一种高效且稳定的排序方法,其速度仅次于快速排序,但比较占用内存。
  其时间复杂度最好、最差、平均情况均为O(nlog(2)n),空间复杂度为O(n)。
 
2、算法思路
  采用分治法的思路将问题分解、细化、逐个解决,即通过递归将无序序列不断分解,直到分解成序列有序(当序列长度为1时一定有序)。再将分解的有序序列不断合并成新的有序序列,最后合并成一个有序序列。
 
 
3、实现代码

 1 #include 
 2 #include 
 3 
 4 // 归并排序:arr  [left,mid]区间升序  [mid+1,rigth]升序   合并这个数组的数据使之升序
 5 void merge(int arr[],int left,int mid,int rigth)
 6 {
 7     int len = mid-left+1;
 8     int* p = malloc(sizeof(int)*len);
 9     // 把[left,mid-1]区间的数据移动到p指向的内存
10     // memcpy(prr,arr+left,l1*sizeof(int));
11     for(int i=0; i<len; i++)
12     {
13         p[i] = arr[left+i];
14     }
15     // 把p[0,len-1]  arr[mid,rigth]两部分数据合并到 arr[left,rigth]数组里
16     int i = 0;
17     int j = mid+1;
18     int k = left; // 从left开始放
19     while(i<len && j<=rigth)
20     {
21         if(p[i] < arr[j])
22         {
23             arr[k++] = p[i++];    
24         }
25         else
26         {
27             arr[k++] = arr[j++];    
28         }
29     }
30     while(i < len)
31     {
32         arr[k++] = p[i++];    
33     }
34 }
35 
36 // 通铺使arr left-rigth区间有序
37 void _merge_sort(int arr[],int left,int rigth)
38 {
39     if(left >= rigth) // 只有一个数据  那本来就有序
40     {
41         return;
42     }
43     int mid = (left+rigth)/2;
44     // left mid   mid+1 rigth
45     if(mid > left)
46     {
47         _merge_sort(arr,left,mid); // 让数组 [left,mid]有序
48     }
49     if(rigth > mid+1)
50     {
51         _merge_sort(arr,mid+1,rigth); // 让数组  [mid+1,rigth]有序
52     }
53     merge(arr,left,mid,rigth); // 合并
54 }
55 
56 void merge_sort(int arr[],int len)
57 {
58     _merge_sort(arr,0,len-1);
59 }
60 
61 void travel(int arr[],int len)
62 {
63     for(int i=0; i<len; i++)
64     {
65         printf("%d ",arr[i]);    
66     }    
67     printf("\n");
68 }
69 
70 int main()
71 {
72     int arr[] = {53,82,9,233,43,14,55,9,4,67};
73     int len = sizeof(arr)/sizeof(arr[0]);
74 
75     travel(arr,len);
76     merge_sort(arr,len);
77     travel(arr,len);
78 
79     return 0;
80 }

 
4、测试结果

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved