归并排序的C语言实现【严蔚敏+算法导论】
2015-06-05 07:15
417 查看
算法导论中的实现:
严蔚敏数据结构版本实现:
算法应该不是很复杂,那个递归调用中的关系确实不太容易搞明白。有点“靠巧合编程”的意思。
#include<stdio.h> void Merge(int *array_ptr,int start,int mid,int end); void Merge_Sort(int *pointer,int start,int end ); #define N 2 #define M 88888 void main() { int array ; int i=0; for(i=0;i<N;i++) { array[i]=rand()%N; printf("%d\t",array[i]); } Merge_Sort(array,0,N-1); printf("\n"); for(i=0;i<N;i++) { printf("%d\t",array[i]); } } Merge_Sort(int *pointer,int start,int end ) { int middle=0; if(start<end) { middle=(start+end)/2; Merge_Sort(pointer,start,middle); Merge_Sort(pointer,middle+1,end); Merge(pointer,start,middle,end); } } Merge(int *array_ptr,int start,int mid,int end) { int length1=mid-start+1; int length2=end-mid; int *leftbuff=NULL; int *Rightbuff=NULL; int i=0; int j=0; int k=0; leftbuff=(int*)malloc(sizeof(int)*length1); Rightbuff=(int*)malloc(sizeof(int)*length2); for(i=0;i<length1;i++) { leftbuff[i]=array_ptr[start+i]; } for(j=0;j<length2;j++) { Rightbuff[j]=array_ptr[mid+j+1]; } leftbuff[length1]=M; Rightbuff[length2]=M; i=0; j=0; for(k=start;k<=end;k++) { if(leftbuff[i]<=Rightbuff[j]) { array_ptr[k]=leftbuff[i]; i++; } else { array_ptr[k]=Rightbuff[j]; j++; } } free(leftbuff); free(Rightbuff); }
严蔚敏数据结构版本实现:
#define MERGE_SORT #ifdef MERGE_SORT #define LQ(a,b) (a<=b) //typedef int (*PARR)[6]; //int tr2[6] = {0}; void merge(int sr[],int tr[],int i,int m,int n) { int k = 0,j = 0; for(j = m + 1,k = i;i<=m&&j<=n;++k) { if(LQ(sr[i],sr[j])) tr[k] = sr[i++]; else tr[k] = sr[j++]; } /*while(i<=m) tr[k++] = sr[i++]; while(j<=n) tr[k++] = sr[j++];*/ if(i<=m) memmove(tr+k,sr+i,m-i+1); if(j<=n) memmove(tr+k,sr+j,n-j+1); } void msort(int sr[],int tr[],int s,int t) { //int* tr2 = (int*)malloc(6*sizeof(int)); int tr2[6] = {0}; int m = 0; if(s==t) tr[s] = sr[s]; //return; else { m = (s+t)/2; msort(sr,tr2,s,m); msort(sr,tr2,m+1,t); merge(tr2,tr,s,m,t); } } int main() { int i = 0; int arr[6] = {7,1,3,9,4,5}; //int arr[3] = {7,1,3}; int *ptmpArr = (int*)malloc(6*sizeof(int)); //int tmpArr[6] = {0}; memset(ptmpArr,0,6*sizeof(int)); msort(arr,ptmpArr,0,5); /*msort(arr,arr,0,5);这样传参数也是OK的*/ for(int i = 0;i<6;i++) { printf("%2d ",ptmpArr[i]); } free(ptmpArr); getchar(); return 0; } #endif
算法应该不是很复杂,那个递归调用中的关系确实不太容易搞明白。有点“靠巧合编程”的意思。
相关文章推荐
- c++ 用类模版实现数组类
- 【leetcode c++】ZigZag Conversion
- 'Ui::GoToCellDialog::setupUi(QDialog*&)' ui.setupUi(dialog);(C++ GUI Qt4编程在QT5.3下勘误)
- C语言之断言
- C++基本语法笔记
- 内存分布
- 内存分布图
- python 与 c/c++混合编程
- C++文件读取、数组转存、文件另存
- [Unix下C/C++开发] unix编程书籍推荐
- 真正意义上的“随机”---c语言
- 阶乘
- 如何学好C++语言
- C++图像处理 -- 数据类型及公用函数
- 如何成为一个C++高级程序员
- C++的坑真的多吗
- c++中函数参数传递(值传递、指针传递,引用传递)进一步认识
- C++封装DLL的方法
- c++整理
- C++静态库与动态库