归并排序(C语言实现)
2016-07-07 19:16
363 查看
#include <stdio.h>
#include <stdlib.h>
void merge(int A[], int p, int q, int r);
void merge_sort(int A[], int p, int r);
//主函数
int main()
{
int a[8] = {2, 4, 5, 7, 1, 2, 3, 6};
int i = 0;
merge_sort(a, 0, 7);
for (i = 0; i < 8; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
//归并
void merge(int A[], int p, int q, int r)
{
int i, j, k;
int n1 = q - p + 1;
int n2 = r - q;
int * L = (int *)malloc(sizeof(int) * n1);
int * R = (int *)malloc(sizeof(int) * n2);
if (L == NULL || R == NULL)
{
printf("memory allocation is failed");
exit(-1);
}
for (i = 0; i < n1; i++)
{
L[i] = A[p + i];
}
for (j = 0; j < n2; j++)
{
R[j] = A[q + j + 1];
}
i = 0;
j = 0;
k = p;
while (i < n1 && j < n2)
{
if (L[i] < R[j])
{
A[k++] = L[i++];
}
else
{
A[k++] = R[j++];
}
}
while (i < n1)
{
A[k++] = L[i++];
}
while (j < n2)
{
A[k++] = R[j++];
}
if (L != NULL && R != NULL)
{
free(L);
free(R);
}
}
//归并排序
void merge_sort(int A[], int p, int r)
{
int q;
if (p < r)
{
q = (p + r) / 2;
merge_sort(A, p, q);
merge_sort(A, q+1, r);
merge(A, p, q, r);
}
}
#include <stdlib.h>
void merge(int A[], int p, int q, int r);
void merge_sort(int A[], int p, int r);
//主函数
int main()
{
int a[8] = {2, 4, 5, 7, 1, 2, 3, 6};
int i = 0;
merge_sort(a, 0, 7);
for (i = 0; i < 8; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
//归并
void merge(int A[], int p, int q, int r)
{
int i, j, k;
int n1 = q - p + 1;
int n2 = r - q;
int * L = (int *)malloc(sizeof(int) * n1);
int * R = (int *)malloc(sizeof(int) * n2);
if (L == NULL || R == NULL)
{
printf("memory allocation is failed");
exit(-1);
}
for (i = 0; i < n1; i++)
{
L[i] = A[p + i];
}
for (j = 0; j < n2; j++)
{
R[j] = A[q + j + 1];
}
i = 0;
j = 0;
k = p;
while (i < n1 && j < n2)
{
if (L[i] < R[j])
{
A[k++] = L[i++];
}
else
{
A[k++] = R[j++];
}
}
while (i < n1)
{
A[k++] = L[i++];
}
while (j < n2)
{
A[k++] = R[j++];
}
if (L != NULL && R != NULL)
{
free(L);
free(R);
}
}
//归并排序
void merge_sort(int A[], int p, int r)
{
int q;
if (p < r)
{
q = (p + r) / 2;
merge_sort(A, p, q);
merge_sort(A, q+1, r);
merge(A, p, q, r);
}
}
相关文章推荐
- C语言重写strncpy()、strcmp()、strchr()、atoi()函数
- x64下vs2013 C++遍历目录下所有文件使用_findnext()调试时中断
- C++中ANSI、Unicode、UTF8字符串之间的互转
- C++拷贝构造函数和赋值操作符
- 文本文档提取字符串
- SDKD 2016 Summer Single Contest #02.B
- [NOIP1999]拦截导弹
- C语言中 float double在内存中的存储
- 设计模式C++学习笔记之十九(State状态模式)
- HDU ACM 1002 A + B Problem II
- C++ STL中Map的按Key排序和按Value排序
- c语言==一维数组与二维数组(2)
- VC++中debug跟release编译模式的区别总结
- C/C++中的玄机
- C++类初始化列表与构造函数内赋值区别
- C语言从stdin读取一行字符串的几种方法
- g++默认支持c++11标准的办法
- 泛化之美--C++11可变模版参数的妙用
- 简单的C语言小题目隐藏的知识(一)
- VC++6.0调试