排序(6)---------归并排序(C语言实现)
2014-06-29 23:25
218 查看
归并排序:
归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
归并操作的过程如下:
(1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
(2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置
(3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
(4) 重复步骤3直到某一指针到达序列尾
(5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾
简单的说,就是将一个序列不断的进行二分(当然也可以三分、多分)分裂,然后递归下去,再合并。
源代码:
/*=============================================================================
#
# FileName: Merge_Sort.c
# Desc: 归并排序
#
# Author: zhangyuqing
#
# Created: 2014年6月29日23:18:16
# Version: 0.0.1
#
=============================================================================*/
#include "stdafx.h"
#include <stdlib.h>
#include <malloc.h>
//归并操作
void merge(int src[], int des[], int low, int high ,int mid)
{
int i = low;
int k = low;
int j = mid + 1;
while (( i <= mid ) && ( j <= high ))
{
if (src[i] < src[j])
{
des[k++] = src[i++];
}
else
{
des[k++] = src[j++];
}
}
while (i <= mid)
{
des[k++] = src[i++];
}
while (j <= high)
{
des[k++] = src[j++];
}
}
void MSort(int src[], int des[] ,int low, int high, int max_size)
{
int mid = (low + high) / 2;
if (low == high)
{
des[low] = src[low];
}
else
{
int mid = (low + high) / 2;
int * des_space = (int *)malloc(sizeof(int) * max_size);
if (NULL != des_space)
{
MSort( src, des_space, low, mid, max_size);
MSort( src, des_space, mid+1, high, max_size);
merge( des_space, des, low, high, mid);
}
free(des_space);
}
}
void Meger_Sort(int arr[], int low, int high, int len)
{
MSort( arr, arr, low, high, len);
}
int main(void)
{
int arr[10];
for ( int i=0; i<10; i++) //初始化数据
{
arr[i] = rand()%100; //随机生成数据
}
printf("Before sort:\n"); //打印排序前的数据
for (int i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
//开始排序
Meger_Sort( arr, 0, 10-1, 10);
printf("\nAfter sort:\n"); //打印排序后的数据
for (int i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}
运行结果:
Before sort:
41 67 34 0 69 24 78 58 62 64
After sort:
0 24 34 41 58 62 64 67 69 78 请按任意键继续. . .
如有错误,望不吝指出。
归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
归并操作的过程如下:
(1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
(2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置
(3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
(4) 重复步骤3直到某一指针到达序列尾
(5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾
简单的说,就是将一个序列不断的进行二分(当然也可以三分、多分)分裂,然后递归下去,再合并。
源代码:
/*=============================================================================
#
# FileName: Merge_Sort.c
# Desc: 归并排序
#
# Author: zhangyuqing
#
# Created: 2014年6月29日23:18:16
# Version: 0.0.1
#
=============================================================================*/
#include "stdafx.h"
#include <stdlib.h>
#include <malloc.h>
//归并操作
void merge(int src[], int des[], int low, int high ,int mid)
{
int i = low;
int k = low;
int j = mid + 1;
while (( i <= mid ) && ( j <= high ))
{
if (src[i] < src[j])
{
des[k++] = src[i++];
}
else
{
des[k++] = src[j++];
}
}
while (i <= mid)
{
des[k++] = src[i++];
}
while (j <= high)
{
des[k++] = src[j++];
}
}
void MSort(int src[], int des[] ,int low, int high, int max_size)
{
int mid = (low + high) / 2;
if (low == high)
{
des[low] = src[low];
}
else
{
int mid = (low + high) / 2;
int * des_space = (int *)malloc(sizeof(int) * max_size);
if (NULL != des_space)
{
MSort( src, des_space, low, mid, max_size);
MSort( src, des_space, mid+1, high, max_size);
merge( des_space, des, low, high, mid);
}
free(des_space);
}
}
void Meger_Sort(int arr[], int low, int high, int len)
{
MSort( arr, arr, low, high, len);
}
int main(void)
{
int arr[10];
for ( int i=0; i<10; i++) //初始化数据
{
arr[i] = rand()%100; //随机生成数据
}
printf("Before sort:\n"); //打印排序前的数据
for (int i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
//开始排序
Meger_Sort( arr, 0, 10-1, 10);
printf("\nAfter sort:\n"); //打印排序后的数据
for (int i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}
运行结果:
Before sort:
41 67 34 0 69 24 78 58 62 64
After sort:
0 24 34 41 58 62 64 67 69 78 请按任意键继续. . .
如有错误,望不吝指出。
相关文章推荐
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- C语言实现排序算法之归并排序详解
- 几种基本的排序算法(选择排序,冒泡排序,快速排序,归并排序,希尔排序)C语言实现
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 排序【5】之归并排序的C语言实现
- 排序(6)---------归并排序(C语言实现)
- 排序系列之(2)堆排序及C语言实现
- C语言实现八种基本排序(二)
- c++ 模板实现 -- 直接插入排序和归并排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 快速排序的C语言代码实现
- 【回忆c语言】从指针的定义初始化到链表的插入删除排序实现code
- C语言实现八种基本排序(一)
- C语言实现冒泡和直接插入排序
- 简单插入排序的C语言实现
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- C语言实现八种基本排序(四)
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 两种归并排序算法的实现:二路归并排序和基本归并排序(虚拟消除递归的二路归并排序)
- 一次C语言实现字符排序出现的问题