• 合并排序


    合并排序:把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

    效率:⊙(nlogn)

     伪代码:

     1 Mergesort(A[0..n-1])
     2 //递归调用mergesort来对数组A[0..n-1]排序
     3 //输入:一个可排序数组A[0..n-1]
     4 //输出:非降序排列的数组A[0..n-1]
     5 if n>1
     6     copy A[0..[n/2]-1] to B[0..[n/2]-1]
     7     copy A[[n/2]..n-1] to C[0..[n/2]-1]
     8     Mergesort(B[0..[n/2]-1]
     9     Mergesort(C[0..[n/2]-1]
    10     Merge(B,C,A)
     1 Merge(B[0..p-1],C[0..q-1],A[0..p+q-1])
     2 //将两个有序数组合并为一个有序数组
     3 //输入:两个有序数组B[0..P-1]和C[0..q-1]
     4 //输出:A[0..p+q-1]中已经有序存放了B和C中的元素
     5 i<-0;j<-0;k<-0
     6 while i<p and j<q do
     7     if B[i]<=C[j]
     8     else A[k]<-C[j];j<-j+1
     9     k<-k+1;
    10     if i=p
    11          copy C[j..q-1] to A[k..p+1-1]
    12     else copy B[i..p-1] to A[k..p+q-1]

    合并排序代码实现:

     1 result mergeSort(int *intArray,int n){
     2     if(intArray==NULL||n<0){
     3         return fail;
     4     }
     5     if(n==1){
     6         return success;
     7     }
     8     //分离
     9     int leftLength=n/2;
    10     int rightLength=n-leftLength;
    11 
    12     int *leftArray=(int *)malloc(leftLength*sizeof(int *));
    13     int *rightArray=(int *)malloc(rightLength*sizeof(int *));
    14 
    15     copy(intArray,leftArray,0,0,leftLength);
    16     copy(intArray,rightArray,leftLength,0,rightLength);
    17 
    18 
    19     //子数组排序
    20     mergeSort(leftArray,leftLength);
    21     mergeSort(rightArray,rightLength);
    22 
    23     //合并
    24     merge(leftArray,rightArray,intArray,n);
    25     return success;
    26 }
    27 
    28 result merge(int *leftArray,int *rightArray,int *intArray,int n){
    29     if(leftArray==NULL||rightArray==NULL||intArray==NULL||n<2){
    30         return fail;
    31     }
    32     int leftLength=n/2;
    33     int rightLength=n-leftLength;
    34 
    35     int leftIndex=0;
    36     int rightIndex=0;
    37     int intIndex=0;
    38 
    39     while(leftIndex<leftLength&&rightIndex<rightLength){
    40         if(leftArray[leftIndex]<=rightArray[rightIndex]){
    41             intArray[intIndex]=leftArray[leftIndex];
    42             leftIndex++;
    43         }else{
    44             intArray[intIndex]=rightArray[rightIndex];
    45             rightIndex++;
    46         }
    47         intIndex++;
    48     }
    49     if(leftIndex==leftLength){
    50         copy(rightArray,intArray,rightIndex,intIndex,n-intIndex);
    51     }else{
    52         copy(leftArray,intArray,leftIndex,intIndex,n-intIndex);
    53     }
    54     return success;
    55 }
    56 
    57 void copy(int *sourceArray,int *distArray,int sourceStart,int distStart,int length){
    58     for(int i=0;i<length;i++){
    59         distArray[distStart+i]=sourceArray[sourceStart+i];
    60     }
    61 }


    完整代码:
    View Code
     1 result mergeSort(int *intArray,int n){
     2      if(intArray==NULL||n<0){
     3          return fail;
     4      }
     5      if(n==1){
     6          return success;
     7      }
     8      //分离
     9      int leftLength=n/2;
    10      int rightLength=n-leftLength;
    11  
    12      int *leftArray=(int *)malloc(leftLength*sizeof(int *));
    13      int *rightArray=(int *)malloc(rightLength*sizeof(int *));
    14  
    15      copy(intArray,leftArray,0,0,leftLength);
    16      copy(intArray,rightArray,leftLength,0,rightLength);
    17  
    18  
    19      //子数组排序
    20      mergeSort(leftArray,leftLength);
    21      mergeSort(rightArray,rightLength);
    22  
    23      //合并
    24      merge(leftArray,rightArray,intArray,n);
    25      return success;
    26  }
    27  
    28  result merge(int *leftArray,int *rightArray,int *intArray,int n){
    29      if(leftArray==NULL||rightArray==NULL||intArray==NULL||n<2){
    30          return fail;
    31      }
    32      int leftLength=n/2;
    33      int rightLength=n-leftLength;
    34  
    35      int leftIndex=0;
    36      int rightIndex=0;
    37      int intIndex=0;
    38  
    39      while(leftIndex<leftLength&&rightIndex<rightLength){
    40          if(leftArray[leftIndex]<=rightArray[rightIndex]){
    41              intArray[intIndex]=leftArray[leftIndex];
    42              leftIndex++;
    43          }else{
    44              intArray[intIndex]=rightArray[rightIndex];
    45              rightIndex++;
    46          }
    47          intIndex++;
    48      }
    49      if(leftIndex==leftLength){
    50          copy(rightArray,intArray,rightIndex,intIndex,n-intIndex);
    51      }else{
    52          copy(leftArray,intArray,leftIndex,intIndex,n-intIndex);
    53      }
    54      return success;
    55  }
    56  
    57  void copy(int *sourceArray,int *distArray,int sourceStart,int distStart,int length){
    58      for(int i=0;i<length;i++){
    59          distArray[distStart+i]=sourceArray[sourceStart+i];
    60      }
    61  }

    参考:算法设计与分析基础

  • 相关阅读:
    高兴
    学习新技术方法感想
    [转]世界变换、观察变换、投影变换 矩阵
    [翻译]投影变换 Projection Transform (Direct3D 9)
    [翻译]观察变换View Transform (Direct3D 9)
    影响计划的若干种种
    记一次感冒
    操蛋 京东 配电脑 自助装机 严重问题
    2015年总结2016展望
    编程易犯毛病总结
  • 原文地址:https://www.cnblogs.com/dann/p/2734812.html
Copyright © 2020-2023  润新知