歸併排序:採用的是一種分而治之的思想.
過程:將乙個陣列進行二分,直到有每組有乙個元素為止.然後進行合併元素,按照一定的順序進行排序.
**實現:
①:遞迴實現
void merge(int arr,int left,int mid,int right,int tmp)
int start = left;
int end = mid;
intindex = 0;
while(start < mid && end < right)
else
}while(start < mid)
while(end < right)
memcpy(arr + left,tmp,sizeof(int)*(right - left));
}void _mergesort(int arr,int left,int right,int tmp)
int mid = left + (right - left)/2;
_mergesort(arr,left,mid,tmp);
_mergesort(arr,mid,right,tmp);
merge(arr,left,mid,right,tmp);
}//歸併排序(遞迴)
void mergesort(int arr,int size)
int* tmp = (int*)malloc(sizeof(arr[0])*size);
_mergesort(arr,0,size,tmp);
free(tmp);
}
②:非遞迴實現
void merge(int arr,int left,int mid,int right,int tmp)
int start = left;
int end = mid;
int index = 0;
while(start < mid && end < right)
else
}while(start < mid)
while(end < right)
memcpy(arr + left,tmp,sizeof(int)*(right - left));
}//非遞迴
void mergesortbyloop(int arr,int
size)
int gap = 1;
int* tmp = (int
*)malloc(sizeof(arr[0])*size);
for(;gap < size;gap *=
2)
if(end > size)
merge(arr,start,mid,end,tmp);}}
}
歸併排序遞迴與非遞迴實現
基本思路 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。歸併排序遞迴體,把整個序列遞迴分為兩個長度為1的子...
歸併排序(遞迴與非遞迴)
1.遞迴 把序列分成元素個數盡量相等的兩部分,再將兩半分別排序,合併有序的兩個序列 遞迴 void merge sort int a,int low,int heigh,int t a為待排序陣列,low,high分別為a的上下限 0 n 1 t為輔助陣列 for i low,j 0 i heigh...
歸併排序(遞迴與非遞迴)的實現
摘要 1 歸併排序幾乎以o nlogn 的時間界實現,是典型的分治演算法 2 歸併排序的基本思路很簡單 就是將目標序列分為兩個部分,將兩個子串行排序好之後,再將它們合併。注意到合併兩個已排序的序列只需要o n 的時間界。3 對兩個子串行的排序顯然也是通過遞迴的歸併排序實現的。4 需要注意的乙個小細節...