归并排序算法
来源:互联网 发布:免费自动发卡平台源码 编辑:程序博客网 时间:2024/05/22 07:41
归并排序就是利用归并的思想实现的排序方法。原理如图所示:
#include <stdio.h>#include <malloc.h>void println( int a[], int len ){int i = 0;for( i=0; i < len; i++ ){printf("%d ", a[i]);}printf("\n");}void swap( int a[], int i, int j ){int temp = a[i];a[i] = a[j];a[j] = temp;}void Merge(int src[], int des[], int low, int mid, int high){int i = low;int j = mid+1;int k = low;static int count = 0;while( ( i <= mid ) && ( j <= high ) ){//找出[low...mid]和[mid+1...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++];}printf("calling: %d\n", count++);}void MSort(int src[], int des[], int low, int high, int max ){if( low == high ){des[low] = src[low];}else{int mid = (low+high) / 2; //将序列分成两部分int* space = (int*)malloc(sizeof(int) * max); //分配辅助空间if( space != NULL ){MSort( src, space, low, mid, max ); //将src[low...mid]归并为有序的space[low...mid]MSort( src, space, mid+1, high, max); //将src[mid+1....high]归并为有序的space[low...mid]Merge( space, des, low, mid, high ); //将space[low...mid]和space[low...mid]归并到des[low...high]}free(space);}}void MergeSort( int a[], int len ){MSort( a, a, 0, len-1, len);}int main(){int array[] = {21, 25, 49, 21, 16, 8};int len = sizeof(array) / sizeof(*array);println(array, len);MergeSort(array, len);println(array, len);return 0;}
在void Merge(int src[], int des[], int low, int mid, int high)函数的第10行判断语句
if( src[i] <= src[j] )
{
des[k++] = src[i++];
}
else
{
des[k++] = src[j++];
}
好多算法介绍上都是if( src[i] < src[j] ),我个人认为这样导致了不稳定性。因为在src[i]==src[j]的时候,选择的是右半部分的src[j]元素,而左半部分的src[i]元素放在了src[j]的后面,这样就不是稳定的了,因此应该改成if( src[i] <= src[j] )
0 0
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- JAVA学习笔记--this的用法
- 十六周——判断两个有序数组中是否存在相同的数字
- 内部排序算法之希尔排序
- 想法
- const char*, char const*, char*const的区别
- 归并排序算法
- The method setOnClickListener(View.OnClickListener) in the type View is not applicable for the argum
- 如何看懂源代码--(分析源代码方法)
- html基础一
- C# 通过反射获取/设置属性值
- Linux网络接口配置文件ifcfg-eth0解析
- struts-2.3.1+spring-framework-3.2.2+hibernate-4.1.1整合历程<第三部分>(详解)
- xml 编程
- 集群