归并排序
来源:互联网 发布:三星note8画画软件 编辑:程序博客网 时间:2024/06/12 01:18
归并排序
排序思想:(分治思想)先将整个集和进行递归拆分,拆到一个数据的时候开始返回,然后进行合并返回;
时间复杂度: o(n * (log n / log 2) )
稳定性: 稳定
//归并排序接口函数
void merge_sort(int *array, int length)
{
int *temp = NULL;
if(array == NULL || length < 2){
return ;
}
temp = (int *)Malloc(sizeof(int) * length);
Merge_sort(array, 0, length - 1, temp);
free(temp);
}
// 先拆分,再合并
//
//1.拆分
//
// 14 3 57 2 45 33 30 2
//
// 14 3 57 2 45 33 30 2
//
// 14 3 57 2 45 33 30 2
//
// 14 3 57 2 45 33 30 2 单独成为一个序列
//
///////////////////////////////////////////////////////////////////
//
//
//
// 2.合并
//
// 3 14 2 57 33 45 2 30
//
//
// 2 3 14 57 2 30 33 45
//
// 2 2 3 14 30 33 45 57
//
//归并排序 分开函数
static void Merge_sort(int *array, int left, int right, int *temp){
int mid = -1;
if(left < right){
mid = left + ((right - left) >> 1); //避免内存泄露
//拆分阶段
Merge_sort(array, left, mid, temp);
Merge_sort(array, mid + 1, right, temp);
//合并两个有序序列
merge_array(array, left, mid, right, temp);
}
}
//归并排序 合并函数
static void merge_array(int *array, int left,
int mid, int right, int *temp)
{
int i = left; //i和j为两个序列的起点
int j = mid + 1;
int m = mid; //mid和right为两个序列的终点
int n = right;
int k = 0; //temp存放结果的下标
// 2 3 14 57 i->m array1
// 2 30 33 45 j->n array2
//
while(i <= m && j <= n){ //array1和array2的元素进行比较
if(array[i] <= array[j]){
temp[k++] = array[i++];
}else{
temp[k++] = array[j++];
}
}
while(i <= m){
temp[k++] = array[i++];
}
while(j <= n){
temp[k++] = array[j++];
}
//把temp的内容复制到array的指定位置
memcpy(array + left, temp, sizeof(int) * k);
}
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 单用户进入SQLServer并修改行版本控制级别
- iOS基础:NSDate
- BestCoder-Machine(三进制-彩灯变换)
- OpenCV完美配置攻略
- Shell中创建序列和数组(list、array)的方法
- 归并排序
- 关于TCP的问题总结
- c++类型转换关键字dynamic_cast和static_cast的使用区别
- 简单模仿Struts2实现AOP
- 【vc++/office ocr引擎】图片文字识别
- LightOJ - 1019 Brush (V) (最短路) 水
- 【杭电oj】2602 - Bone Collector(01背包)
- 下载Youtube视频只有2个步骤
- [参考]spring整合redis!