十大经典排序算法之归并排序【五】
【归并排序】(Shell Sort)
a) 原理
归并排序是利用归并的思想实现的排序方法,算法采用分治法(divide-and-conquer)的典型应用。分而治之,分即将问题分成一些小的问题,治即将各小问题的结果集合在一起。
b) 演示动态图


c) 算法步骤
l 将整个数组按照递归方法依次二分,直到分成每一个元素的序列;
l 对每一个元素的序列进行比较,然后放入分配好空间的temp数组中;
l 将temp中元素复制到原来数组中,然后释放temp内存。
d) 代码实现
1 #include <iostream> 2 #include <stdlib.h> 3 #include <cmath> 4 #include <string.h> 5 6 using namespace std; 7 8 void MergeArray(int*, size_t, size_t, size_t, int*); 9 void MMergeSort(int*, size_t, size_t, int*); 10 void MergeSort(int*, size_t); 11 void PrintStr(int*,int); 12 13 int main() 14 { 15 int str[] = {2,5,6,1,53,26,64,18,98,18}; 16 int strlen = sizeof(str)/sizeof(str[0]); 17 cout << "排序前数组序列:"; 18 PrintStr(str,strlen); 19 20 MergeSort(str, strlen); 21 22 cout << "排序后数组序列:"; 23 PrintStr(str,strlen); 24 return 0; 25 } 26 27 //归并排序 28 void MergeArray(int* arr, size_t left, size_t mid, size_t right, int* temp) 29 { 30 if(arr==NULL) return; 31 32 size_t i=left,j=mid+1,k=0; 33 while(i<=mid && j<=right) 34 { 35 if(arr[i]<=arr[j]) 36 { 37 temp[k++]=arr[i++]; 38 continue; 39 } 40 41 temp[k++]=arr[j++]; 42 } 43 44 while(i<=mid) 45 temp[k++]=arr[i++]; 46 47 while(j<=right) 48 temp[k++]=arr[j++]; 49 50 memcpy(&arr[left],temp,k*sizeof(int)); 51 52 return; 53 } 54 55 void MMergeSort(int* arr, size_t left, size_t right, int* temp) 56 { 57 if(left<right) 58 { 59 size_t mid=(left+right)/2; 60 MMergeSort(arr, left, mid, temp); 61 MMergeSort(arr, mid+1,right, temp); 62 MergeArray(arr,left, mid, right, temp); 63 } 64 } 65 66 void MergeSort(int* h, size_t len) 67 { 68 if(h==NULL) return; 69 if(len<=1) return; 70 int* temp=(int*)calloc(len,sizeof(int)); 71 MMergeSort(h, 0, len-1, temp); 72 memcpy(h,temp,sizeof(int)*len); 73 free(temp); 74 return; 75 } 76 void PrintStr(int* str,int strlen) 77 { 78 for (int i = 0;i < strlen;i++) 79 cout << str[i] << ','; 80 cout << endl; 81 }
参考博客:https://www.cnblogs.com/onepixel/articles/7674659.html,再次感谢!

浙公网安备 33010602011771号