zoukankan      html  css  js  c++  java
  • Merge Sort

    实现如下:

    代码
            #region Merge Sort
            
    private static void Merge(int[] data, int startIndex1, int endIndex1, int startIndex2, int endIndex2)
            {
                
    if (data == null || data.Length < 1)
                {
                    
    throw new ArgumentNullException("data");
                }
                
    if (startIndex1 < 0 || startIndex2 < 0 || endIndex1 < startIndex1 || endIndex2 < startIndex2 ||
                    endIndex1 
    > data.Length || endIndex2 > data.Length)
                {
                    
    throw new ArgumentException("index");
                }

                
    int[] tempArray = new int[endIndex1 - startIndex1 + endIndex2 - startIndex2 + 2];
                
    int index1 = startIndex1, index2 = startIndex2;
                
    int tempIndex = 0;
                
    while(index1 <= endIndex1 && index2 <= endIndex2)
                {
                    
    if (data[index1] <= data[index2])
                    {
                        tempArray[tempIndex
    ++= data[index1++];
                    }
                    
    else
                    {
                        tempArray[tempIndex
    ++= data[index2++];
                    }
                }

                
    while (index1 <= endIndex1)
                {
                    tempArray[tempIndex
    ++= data[index1++];
                }
                
    while (index2 <= endIndex2)
                {
                    tempArray[tempIndex
    ++= data[index2++];
                }

                tempIndex 
    = 0;
                
    for (int i = startIndex1; i <= endIndex1; i++)
                {
                    data[i] 
    = tempArray[tempIndex++];
                }
                
    for (int i = startIndex2; i <= endIndex2; i++)
                {
                    data[i] 
    = tempArray[tempIndex++];
                }
            }

            
    private static void MergePass(int[] data, int cellLength)
            {
                
    if (data == null || data.Length < 1)
                {
                    
    throw new ArgumentNullException("data");
                }
                
    if (cellLength < 1 || cellLength > data.Length)
                {
                    
    throw new ArgumentException("cellLength");
                }

                
    int index = 0;
                
    while (index <= data.Length - cellLength * 2)
                {
                    Merge(data, index, index 
    + cellLength - 1, index + cellLength, index + cellLength * 2 - 1);
                    index 
    += 2 * cellLength;
                }
                
    if (index + cellLength < data.Length)
                {
                    Merge(data, index, index 
    + cellLength - 1, index + cellLength, data.Length - 1);
                }
            }

            
    /// <summary>
            
    /// 二路归并排序
            
    /// </summary>
            
    /// <param name="data"></param>
            public static void MergeSort(int[] data)
            {
                
    if (data == null || data.Length < 1)
                {
                    
    throw new ArgumentNullException("data");
                }

                
    int cellLength = 1;
                
    while (cellLength < data.Length)
                {
                    MergePass(data, cellLength);
                    cellLength 
    *= 2;
                }
            }
            
    #endregion
  • 相关阅读:
    每日一练leetcode
    每日一练leetcode
    每日一练 leetcode
    每日一练leetcode
    每日一练leetcode
    leetcode每日一练
    BigDecimal类 定义及用法
    每日一练leetcode
    每日一练leetcode
    字符串表达式校验&求值(C#实现) 附代码
  • 原文地址:https://www.cnblogs.com/Langzi127/p/1692790.html
Copyright © 2011-2022 走看看