diff --git a/归并排序 b/归并排序 new file mode 100644 index 0000000..565afb4 --- /dev/null +++ b/归并排序 @@ -0,0 +1,75 @@ +二路排序(这个一般是二路归并排序,在这里写归并排序)。 +1.基本思想: +将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素。将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素.重复步骤2,直到所有元素排序完毕 +2.复杂程度:归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间. +3.代码: +#include +#include +#define N 7 + +void merge(int arr[], int low, int mid, int high){ + int i, k; + int tmp = (int *)malloc((high-low+1)sizeof(int)); + //申请空间,使其大小为两个 + int left_low = low; + int left_high = mid; + int right_low = mid + 1; + int right_high = high; + +for(k=0; left_low<=left_high && right_low<=right_high; k++){ // 比较两个指针所指向的元素 + if(arr[left_low]<=arr[right_low]){ + tmp[k] = arr[left_low++]; + }else{ + tmp[k] = arr[right_low++]; + } +} +if(left_low <= left_high){ //若第一个序列有剩余,直接复制出来粘到合并序列尾 +//memcpy(tmp+k, arr+left_low, (left_high-left_low+l)*sizeof(int)); +for(i=left_low;i<=left_high;i++) + tmp[k++] = arr[i]; +} +if(right_low <= right_high){ +//若第二个序列有剩余,直接复制出来粘到合并序列尾 +//memcpy(tmp+k, arr+right_low, (right_high-right_low+1)*sizeof(int)); + for(i=right_low; i<=right_high; i++) + tmp[k++] = arr[i]; +} +for(i=0; i> 1); + merge_sort(arr, first, mid); + merge_sort(arr, mid+1,last); + merge(arr,first,mid,last); + } + return; +} + +int main(){ + int i; + int a[N]={32,12,56,78,76,45,36}; + +printf ("排序前 \n"); +for(i=0;i