归并排序

来源:互联网 发布:软件测试需要linux 编辑:程序博客网 时间:2024/04/25 17:52

排序算法——合并排序(Merge sort)


合并排序(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行将排好序的序列复制到数组。

------------------------------------------------自己代码--------------------------------------------------------------------------------------

#include <iostream>#include <stdio.h>using namespace std;void merge(int arr[],int start,int mid,int end){int *arrs=(int*)malloc(sizeof(int)*(end-start+1));int s=start,m=mid+1,i=0;while(s<=mid&&m<=end){if(arr[s]<arr[m]){arrs[i++]=arr[s];s++;}else{arrs[i++]=arr[m];m++;}}while(s<=mid)arrs[i++]=arr[s++];while(m<=end)arrs[i++]=arr[m++];for(int k=start,i=0;k<=end;k++)arr[k]=arrs[i++];free(arrs);};void divideconquer(int arr[],int start,int end){if(start<end){int mid =(start+end)/2;divideconquer(arr,start,mid);divideconquer(arr,mid+1,end);merge( arr, start, mid, end);}};void main(){int arr[]={1,2,3,4,5};divideconquer(arr,0,4);for(int i=0;i<5;i++)cout<<arr[i]<<endl;system("pause");}


0 0
原创粉丝点击