/*******************************************************************************
归并排序(Merge Sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并操作的工作原理如下:
1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置。
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
4.重复步骤3直到某一指针达到序列尾。
5.将另一序列剩下的所有元素直接复制到合并序列尾。
归并排序具体工作原理如下(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作(merge),形成floor(n / 2)个序列,排序后每个序列包含两个元素。
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素。
3.重复步骤2,直到所有元素排序完毕。
比较操作的次数介于 (nlogn)/2 和 nlogn - n + 1。 赋值操作的次数是(2nlogn)。 归并算法的空间复杂度为:Θ(n)
************************************************************************
*/
归并排序(Merge Sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并操作的工作原理如下:
1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置。
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
4.重复步骤3直到某一指针达到序列尾。
5.将另一序列剩下的所有元素直接复制到合并序列尾。
归并排序具体工作原理如下(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作(merge),形成floor(n / 2)个序列,排序后每个序列包含两个元素。
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素。
3.重复步骤2,直到所有元素排序完毕。
比较操作的次数介于 (nlogn)/2 和 nlogn - n + 1。 赋值操作的次数是(2nlogn)。 归并算法的空间复杂度为:Θ(n)
************************************************************************
void Merge(int array[], int first, int mid, int last) { int i, j = 0; int begin1 = first, end1 = mid, begin2 = mid + 1, end2 = last; int *temp = (int *)malloc((last - first + 1) * sizeof(int)); if (!temp) { fprintf(stderr, "\n内存分配失败,程序将强制退出!\n"); getch(); exit(1); } while (begin1 <= end1 && begin2 <= end2) { if (array[begin1] < array[begin2]) { temp[j++] = array[begin1]; begin1++; } else { temp[j++] = array[begin2]; begin2++; } } while (begin1 <= end1) { temp[j++] = array[begin1++]; } while(begin2 <= end2) { temp[j++] = array[begin2++]; } for (i = 0; i < (last - first + 1); i++) { array[first + i] = temp[i]; } free(temp); } void _MergeSort(int *array, int first, int last) { int mid; if (first < last) { mid = (first + last) / 2; _MergeSort(array, first, mid); _MergeSort(array, mid + 1, last); Merge(array, first, mid, last); } } void MergeSort(int *array, int length) { _MergeSort(array, 0, length - 1); }
*/
这个代码花费了我一个晚上,哈哈,还是不够熟练啊,完全没有头绪,想了好久,现在连时间性能也没能很好的理解。
这个排序算法使用了分治的策略,
1)分解
2)解决
3)合并
三步,分解成小步,有时解决和合并时一起进行的,归并排序就是这样。
思路为:通过递归把一组数不断分解,通过某个条件退出递归的嵌套,执行解决排序合并