现在的位置: 首页 > 综合 > 正文

排序算法——合并排序

2013年03月10日 ⁄ 综合 ⁄ 共 1131字 ⁄ 字号 评论关闭

合并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

最坏时间复杂度 O(nlogn)

合并排序是稳定的排序算法

Code:
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3.   
  4. void merge(int a[], int p, int q, int r)   
  5. {   
  6.     int i, j, k;   
  7.     int *temp = (int *)malloc((r - p + 1) * sizeof(int));   
  8.   
  9.     i = p;   
  10.     j = q + 1;   
  11.     k = 0;   
  12.     while ((i <= q) && (j <= r)) {   
  13.         if (a[i] < a[j])   
  14.             temp[k] = a[i++];   
  15.         else  
  16.             temp[k] = a[j++];   
  17.         k++;   
  18.     }   
  19.     while (i <= q)   
  20.         temp[k++] = a[i++];   
  21.     while (j <= r)   
  22.         temp[k++] = a[j++];   
  23.   
  24.     for (i = 0; i < r - p + 1; i++) {   
  25.         a[p+i] = temp[i];   
  26.     }   
  27.     free(temp);   
  28. }   
  29. void merge_sort(int a[], int p, int r)   
  30. {   
  31.     int q;   
  32.     if (p < r) {   
  33.         q = (p + r) / 2;   
  34.         merge_sort(a, p, q);   
  35.         merge_sort(a, q + 1, r);   
  36.         merge(a, p, q, r);   
  37.     }   
  38. }   
  39.   
  40. int main()   
  41. {   
  42.     int a[] = {5,2,4,7,1,3,2,6}, i;   
  43.     int p = 0, r = sizeof(a) / sizeof(int);   
  44.     merge_sort(a, p, r);   
  45.   
  46.     for (i = 0; i < r; i++)   
  47.         printf("%d ", a[i]);   
  48.     return 0;   
  49. }  

12-18行选择最小的元素复制到temp,19-22行将剩余序列的元素复制到temp,24-26行将排好序的序列复制到数组。

抱歉!评论已关闭.