(递归版)合并排序
时间:2022-04-22
本文章向大家介绍(递归版)合并排序,主要内容包括算法思想:、主要代码:、全部代码:、运行示例:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
递归版的合并排序,时间复杂度为O(nlogn),空间复杂度为O(n+logn);
算法思想:
利用分而自治的思想,把排序分成两块,每块内部排序,再进行一次遍历排序即可,递归调用此过程即可。
主要代码:
void MergeSort(int *arr,int length){
Msort(arr,arr,0,length-1);
}
void Msort(int *arr1,int *arr2,int begin,int end){
int arr3[10];
int m;
if(begin == end)
arr2[begin] = arr1[end];
else{
m = (end + begin)/2;
Msort(arr1,arr3,begin,m);
Msort(arr1,arr3,m+1,end);
sort(arr3,arr2,begin,m,end);
}
}
void sort(int *arr3,int *arr1,int begin,int m,int end){
int i=begin,j=m+1,k,h;
for(k=i; i<=m && j<=end;k++){
if(arr3[i] < arr3[j])
arr1[k] = arr3[i++];
else
arr1[k] = arr3[j++];
}
if(i <= m){
for(h=0; h<=m-i;h++)
arr1[k+h] = arr3[i+h];
}else{
for(h=0; h<=end-j;h++)
arr1[k+h] = arr3[j+h];
}
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int arrtest1[10] = {3,4,7,8,0,9,1,2,6,5};
int arrtest2[10] = {0,1,2,3,4,5,6,7,8,9};
int arrtest3[10] = {9,8,7,6,5,4,3,2,1,0};
void copy(int *from,int *arr,int length);
void print(int *arr,int length);
void MergeSort(int *arr,int length);
void Msort(int *arr1,int *arr2,int begin,int end);
void sort(int *arr3,int *arr1,int begin,int m,int end);
int main(){
clock_t start,end;
int Arr[10];
int i;
copy(arrtest1,Arr,10);
print(Arr,10);
MergeSort(Arr,10);
print(Arr,10);
start = clock();
for(i=0;i<100000;i++){
copy(arrtest1,Arr,10);
//print(Arr,10);
MergeSort(Arr,10);
//print(Arr,10);
}
end = clock();
printf("first test:%dn",end-start);
start = clock();
for(i=0;i<100000;i++){
copy(arrtest2,Arr,10);
//print(Arr,10);
MergeSort(Arr,10);
//print(Arr,10);
}
end = clock();
printf("first test:%dn",end-start);
start = clock();
for(i=0;i<100000;i++){
copy(arrtest3,Arr,10);
//print(Arr,10);
MergeSort(Arr,10);
//print(Arr,10);
}
end = clock();
printf("first test:%dn",end-start);
getchar();
return 0;
}
void MergeSort(int *arr,int length){
Msort(arr,arr,0,length-1);
}
void Msort(int *arr1,int *arr2,int begin,int end){
int arr3[10];
int m;
if(begin == end)
arr2[begin] = arr1[end];
else{
m = (end + begin)/2;
Msort(arr1,arr3,begin,m);
Msort(arr1,arr3,m+1,end);
sort(arr3,arr2,begin,m,end);
}
}
void sort(int *arr3,int *arr1,int begin,int m,int end){
int i=begin,j=m+1,k,h;
for(k=i; i<=m && j<=end;k++){
if(arr3[i] < arr3[j])
arr1[k] = arr3[i++];
else
arr1[k] = arr3[j++];
}
if(i <= m){
for(h=0; h<=m-i;h++)
arr1[k+h] = arr3[i+h];
}else{
for(h=0; h<=end-j;h++)
arr1[k+h] = arr3[j+h];
}
}
void copy(int *from,int *arr,int length){
int i;
for(i=0;i<length;i++){
arr[i] = from[i];
}
}
void print(int *arr,int length){
int i;
for(i=0;i<length;i++){
printf("%d ",arr[i]);
}
printf("n");
}
运行示例:
- asp.net动态增加服务器端控件并提交表单
- c# asp.net 实现分页(pager)功能
- 一次数据库无法登陆的"问题"及排查(r2第11天)
- popcorn-js视频Video框架简单用法
- 一次数据库响应缓慢的问题排查(r2第9天)
- 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求
- C# 读取指定文件夹下所有文件
- ASP.NET 实现Base64文件流下载PDF
- MVC自定义视图引擎地址
- JS禁止鼠标右键、禁止全选、复制、粘贴的方法(所谓的防盗功能)
- impdp异常中断导致的问题(r2第8天)
- 利用autocomplete.js实现仿搜索效果(ajax动态获取后端[C#]数据)
- sql语句的简化(r2第7天)
- Ajax jsonp 跨域请求实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法