归并排序

来源:互联网 发布:知敬畏明底线敢做 编辑:程序博客网 时间:2024/06/03 04:58
#include <stdio.h>#include <stdlib.h>#include <string.h>void merge(int result[],int data[],int left,int mid,int right){int i = left;int j = mid;int cnt = left;for(; i<mid&&j<=right;){if(data[i] < data[j])result[cnt++] = data[i++];elseresult[cnt++] = data[j++];}for(; i<mid; i++)result[cnt++] = data[i];for(; j<=right; j++)result[cnt++] = data[j];for(i=left; i<=right; i++)data[i] = result[i];}void merge_sort(int result[],int data[],int left,int right){//if(left == right)if(left < right){int mid = (right + left) / 2;//printf("%d %d\n",left,right);merge_sort(result,data,left,mid);merge_sort(result,data,mid+1,right);merge(result,data,left,mid+1,right);}}void display(int data[],int size){for(int i=0; i<size; i++)printf("%d ",data[i]);printf("\n");}int main(){int data[] = {2,32,23,2,22,45,34,234,24324};int size = sizeof(data)/sizeof(int);int workspace[size] ;memset(workspace,-1,size*sizeof(int));display(data,size);merge_sort(workspace,data,0,size-1);display(data,size);return 0;}

在归并的时候,记得把辅助空间的数据复制回待排序空间数组。

同时注意下标!如我在编写的时候搞错了下标的开始 cnt = 0;应为cnt = left.

而且归并的时候 i++,j++;不是同时进行的,这都搞错~.~||||

原创粉丝点击