• 归并排序


    归并算法具有稳定性

    算法思想:

    代码:

       template <typename Comparable>
      void mergeSort(vector<Comparable>&a)
      {
        mergeSort(a,0,a.size()-1);
      }
      
      template <typename Comparable>
      void mergeSort(vector<Comparable>&a,int left, int right)
      {
       if (left < right)
       {
         int mid = (left + right)/2;
         mergeSort(a,left, mid);
        mergeSort(a,mid+1,right);
         merge(a,left, mid+1,right);
       }
     }
     
    template <typename Comparable>
     void merge (vector<Comparable>&a, int leftStart, int rightStart, int rightEnd)
     {
       int leftEnd = rightStart - 1;
       int numElements = rightEnd - leftStart + 1;
       vector<Comparable>temp(numElements);
       int indexTemp = 0;
       int tempLeftStart = leftStart;
       while ( leftStart <= leftEnd && rightStart <= rightEnd )
       {
         if ( a[leftStart] <= a[rightStart] )
           temp[indexTemp++] = a[leftStart++];
         else
           temp[indexTemp++] = a[rightStart++];
       }
       while ( leftStart <= leftEnd )
         temp[indexTemp++] = a[leftStart++];
       while ( rightStart <= rightEnd )
         temp[indexTemp++] = a[rightStart++];
       for ( int i = 0; i < numElements; ++i )
           a[tempLeftStart + i] = temp[i];
     }

    有稳定性

    python版本代码

    def merge(data, leftStart, rightStart, rightEnd):
    
        leftEnd = rightStart - 1
        numElements = rightEnd - leftStart + 1
    
        temp = []
        tempLeftStart = leftStart
    
        while(leftStart <= leftEnd and rightStart <= rightEnd):
            if (data[leftStart] <= data[rightStart]):
                temp.append(data[leftStart])
                leftStart += 1
            else:
                temp.append(data[rightStart])
                rightStart += 1
    
        while leftStart <= leftEnd:
            temp.append(data[leftStart])
            leftStart += 1
    
        while rightStart <= rightEnd:
            temp.append(data[rightStart])
            rightStart += 1
    
        i = 0
        while i < numElements:
            data[tempLeftStart + i] = temp[i]
            i += 1
    
    def mergeSort(data, left, right):
        """归并排序"""
        if left < right:
            mid = (left + right) // 2
            mergeSort(data, left, mid)
            mergeSort(data, mid+1, right)
            merge(data, left, mid+1, right)
    
        return data
  • 相关阅读:
    nginx中目录转义字符问题
    2022年3月2日最近的状态~
    [esp8266]官方SDK与arduino ROM或Flash布局,Vscode+platformio 如何设置
    什么是并发容器
    Executor, ExecutorService 和 Executors区别与联系
    Spirng和SpringBoot中的Aop优先使用的是JDK动态代理还是Cglib
    建造者模式
    MySQL四大排名函数
    SpringMVC执行流程解析(PS:使用了适配器模式)
    适配器模式
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4646437.html
Copyright © 2020-2023  润新知