十大经典排序算法之归并排序【五】

【归并排序】(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,再次感谢!

posted @ 2019-06-10 21:19  xdak  阅读(228)  评论(0)    收藏  举报