归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。(出自维基百科)
平均时间复杂度 |
---|
Conceptually ,归并算法的基本步骤如下所示:
1)使用递归(recursion)方法把未排序的序列分成n个子序列,每个子序列只包含一个元素(一个元素被认为是有序的);
2)使用归并操作重复合并子序列产生新的序列,直到只剩下一个序列,那么这个序列就是有序的。
归并操作(merge) ,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
归并操作算法描述
归并操作的过程如下:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针达到序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
代码实现
#include <stdio.h> #include <stdlib.h> void mergeSort(int arr[], int left, int right); void Merge(int arr[], int left, int middle, int right); int main() { int i; int arr[]={5,2,6,3,9,10,8}; int len = sizeof(arr)/sizeof(int); mergeSort(arr,0,len-1); for (i = 0; i <= len-1; i++) { printf("%3d",arr[i]); } return 0; } void mergeSort(int arr[], int left, int right) { //对数组进行迭代排序 int middle; if(left >= right) return; middle = (left + right)/2; mergeSort(arr,left,middle); mergeSort(arr,middle+1,right); Merge(arr,left,middle,right); } void Merge(int arr[], int left, int middle, int right) { //归并操作 int length = right - left + 1; int *pArr; int beginA = left,beginB = middle + 1; //设置两个标志,分别指向两个已排序序列的起始位置 int nCount = 0,i; pArr = (int *)malloc(sizeof(int)*length); //开辟空间 if (pArr == NULL) { printf("malloc error\n"); return; } while (beginA <= middle) { if (arr[beginA] > arr[beginB]) { pArr[nCount++] = arr[beginB++]; } if (arr[beginA] < arr[beginB]) { pArr[nCount++] = arr[beginA++]; } if (beginB > right) break; } while (beginA <= middle) { pArr[nCount++] = arr[beginA++]; } while (beginB <= right) { pArr[nCount++] = arr[beginB++]; } for (i = 0; i < length; i++) //把排序好的部分移回arr数组中 { arr[left++] = pArr[i]; } free(pArr); }
2013/6/15 12:34