`
sunnyshuhai
  • 浏览: 41592 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

归并排序算法分析

阅读更多

     今天上班没有什么事情需要处理,昨天刚好看在本书上看到归并排序就试着将其代码写了出来。尝试着进行一下分析!感觉从算法的描述到具体的代码,中间有不少细节需要注意。不如到底是小于还是小于等于,是该加一还是减一等等。怪不得有些公司面试时要求进行机试,其实这也是为了考察一个人的动手能了和对细节的处理能力!其实我也不喜欢机试,更别说是有些变态的让直接在纸上写代码的了。。。。

 

   归并排序算法的概念:

 

       归并排序其实是算法里边用的比较多的算法,是“分而治之思想 ”的典型应用。其基本思想是,将一些已排序的子文件进行合并得到一个完整的有序文件。归并是只要比较各子文件记录的关键码,其最小者就是全局最小者(相对于参与比较的字文件);取出它后继续比较各子文件的第一个记录....如此下去就能完成排序任务。

 

 

   实现代码(经过测试):

 

 

 
class MergeSorter

 public  #public methods
    #Appling Top-To-Down method to sort  array:
   def merger_sort_for_array(source_array,start_index,end_index)
         middle=0    
         if start_index< end_index
            middle=(start_index+end_index)/2           
            merger_sort_for_array(source_array,start_index,middle)
            merger_sort_for_array(source_array,middle+1,end_index)
            
            merge_sort(source_array,start_index,middle,end_index)
         end  
    end
 
   #Apping Down-To-Top method to sort array:
  def merger_sort_for_array2(source_array,end_index)
      length=1
     while length<end_index do
      merge_array(source_array,length,end_index)
      length *=2
     end
  end  

 
 private #Priavate methods
  def merge_sort(source_array, start_index, middle_index,end_index)
    first_begin=start_index
    second_begin=middle_index+1
    target_begin=0
    target_array=Array.new(end_index-start_index+1)
  
  #Based on the value copy the elements to temprary in sorted order.
  while first_begin<=middle_index  and  second_begin<=end_index 
          if source_array[first_begin] > source_array[second_begin] 
             target_array[target_begin]=source_array[second_begin]
             target_begin  =target_begin + 1
             second_begin  =second_begin + 1
          else 
             target_array[target_begin]=source_array[first_begin]
             target_begin  =target_begin + 1
             first_begin  =first_begin + 1           
          end    
   end
   
    #Copy the left part to temprary array if there are element left.   
    while first_begin<=middle_index do
           target_array[target_begin]=source_array[first_begin]
           first_begin =first_begin + 1
           target_begin +=1
    end  
        
    #Copy the right part elemnnts to temprary if there are element left.    
    while second_begin<= end_index do
        target_array[target_begin]=source_array[second_begin]
        second_begin =second_begin + 1
        target_begin +=1
      end
    
    #Copy the result back to the source array 
    i=start_index
    p=0
    while   i<=end_index do
       source_array[i]=target_array[p]
       p +=1
       i +=1
    end
  end


#Do a single trip sorting
def merge_array(source_array,length,end_index)
  start_index=0 
  while( start_index+2*length-1<=end_index) do
    merge_sort(source_array,start_index,start_index+length-1,start_index+2*length-1)
    start_index +=2*length
  end
   
  #There are tow data parts left ,and the last parts' length is less than length.
  if (start_index+length-1)<end_index  
     merge_sort(source_array,start_index,start_index+length-1,end_index)
  end
 end  

end 
 
 
 #Test code:
 sorter=MergeSorter.new() 
 source_array=[1,3,2,5,7,6,2,8,4,-6,12]
 source_array2=[1,3,2,5,7,6,2,8,4,-6,12]

 sorter.merger_sort_for_array2(source_array,10)
 puts source_array
  
 sorter.merger_sort_for_array(source_array2 , 0 , 10)  
 puts source_array2
  
 

 

   使用预定义数组的实现:

 

   该实现的时间开销为n*log(n) ,空间开销为O(n)既辅助数组的大小。

 

#Merge Sort
class Sorter
def  do_merge_sort(source_array,start_index,middle,end_index,target_array)
     
     first_index=start_index
     second_index=middle+1
     position=start_index
     while first_index<=middle and second_index<=end_index do
     
             if source_array[first_index] <source_array[second_index]
                target_array[position]=source_array[first_index]
                first_index  =first_index+1
             else
                target_array[position]=source_array[second_index]
                second_index  =second_index+1
              end 
             position  =position+1
    end
           
     while first_index<=middle do
        target_array[position]=source_array[first_index]
        position  +=1
        first_index  +=1
      end
      
    while second_index<=end_index do
        target_array[position] =source_array[second_index]
        position  +=1
        second_index  +=1
    end
  end  
  
def   merge_sort(source_array,start_index,end_index,target_array)
  
    if start_index==end_index
      target_array[start_index]=source_array[end_index]
    else        
      middle=(start_index+end_index)/2
      merge_sort(source_array,start_index,middle,target_array)
      merge_sort(source_array,middle+1,end_index,target_array)
     
     #First sort the target_array
      do_merge_sort(source_array,start_index,middle,end_index,target_array)
      #Then copy the sorted target_array to source_array
      do_merge_sort(target_array,start_index,middle,end_index,source_array)
      
    end
end 
end

source=[1,3,2,4,7,2,0,-2]
target=Array.new(8,0)

sorter=Sorter.new()
sorter.merge_sort(source,0,7,target)

print source
puts ""
print target
 

 

   算法分析和讨论:

         本实现使用了同一种思想的两种不同的实现,一个是自顶而下,一个是自底而上的。两种算法的时间复杂度都是n*Log(n).空间复杂度也是n*Log(n),因为每一趟的排序过程中要建立临时的数组,其空间大小基本上和待排序数组一致。

         还有另外其他的一些实现方式,比如可以预先创建一个辅助数组,大小和待排序的数组一样大。通过该辅助数组可以降低算法的空间复杂度,既O(n).但是这会使的算法的可理解性下降。所以在实际应用时,根据具体的需要选择不同的算法实现。一般情况下对算法的可理解行要求不该,可以使用预创建的辅助数组降低空间开销,但是如果程序对空间开销要求不高,建议使用可理解行高的算法实现。

 

   总结:

          一种算法思想可以有不同的实现,实现之间的空间开销和时间开销个不相同。因此我们要根据需要仔细选择算法实现。

 

 

 

0
0
分享到:
评论

相关推荐

    归并排序算法(计算机算法与分析)

    归并排序算法是一种高效稳定的排序方法,其基本思想源于分治法。该算法将一个大问题分解成两个或更多的小问题来解决,然后再合并这些小问题的解,从而得到最终的大问题的解。在归并排序中,我们将一个大的数组分割成...

    归并排序算法实现

    ### 归并排序算法实现详解 #### 一、引言 归并排序是一种经典的排序算法,采用分治法的思想,将待排序数组分为若干个子序列,这些子序列是已排序的,然后再按照一定的方式合并这些子序列得到最终排序后的数组。...

    C语言二路归并排序算法

    ### C语言二路归并排序算法 #### 概述 归并排序是一种高效的排序算法,其基本思想是采用分治法(Divide and Conquer),将一个数组分成两个子数组,然后递归地对这两个子数组进行排序,最后将两个有序的子数组合并...

    C++实现希尔、快速、堆排序、归并排序算法

    在编程领域,排序算法是计算机科学中的重要组成部分,特别是在数据处理和算法效率分析上。本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年...

    归并排序算法实现(排序算法系列1)

    通过查看和分析这段代码,我们可以更深入地理解归并排序的内部机制,学习如何在实际编程项目中应用这种排序算法。 总结来说,归并排序是一种分治策略的体现,具有稳定且高效的排序性能。它通过递归或迭代的方式分割...

    分治法实现归并排序算法算法设计与分析实验报告.docx

    **实验报告:分治法实现归并排序算法** 实验名称:分治法实现归并排序算法 实验日期:年月日 姓名: 学号: 专业班级: ### 一、实验要求 1. **理解分治法**:分治法是一种解决问题的策略,适用于将大问题分解成...

    MATLAB实现插入排序、二分归并排序、归并排序.rar

    在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...

    快速排序与归并排序的算法比较实验报告

    **快速排序与归并排序算法比较实验报告** 在计算机科学中,排序算法是处理大量数据时不可或缺的一部分。这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试...

    给定一个数列,用归并排序算法把它排成升序。

    ### 归并排序算法知识点详解 #### 一、归并排序基本概念 归并排序是一种典型的分治策略算法,其核心思想是将待排序的数据序列分成若干子序列,然后对这些子序列进行排序,最后再合并成有序序列。归并排序的时间...

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

    归并排序的复杂性分析: - 时间复杂度:在最好的、最坏的和平均情况下,归并排序的时间复杂度都是O(n log n)。这是因为无论输入数据的初始顺序如何,都需要对n个元素进行log n次划分和合并。 - 空间复杂度:归并排序...

    改进的归并排序算法

    然而,题目中提到的“改进的归并排序算法”探讨了两种不同的实现方式:不回写和非递归。 1. **不回写方式**: 在传统的归并排序中,排序过程中会涉及到数组元素的来回移动。不回写是指在排序过程中避免对原始数组...

    快速排序、归并排序等排序算法比较

    快速排序、归并排序、基数排序等排序算法比较,比较时间性能,采用C++语言实现。。。

    归并排序算法(C语言)

    ### 归并排序算法原理 归并排序的基本步骤可以概括为以下几点: 1. **分解**:将待排序的序列分解成尽可能小的子序列,直至每个子序列只有一个元素。由于单个元素的序列自然就是有序的,因此这一步实际上是在准备...

    算法设计实验报告-快速排序和归并排序

    本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...

    一个 c c++写的归并排序算法

    根据给定的信息,本文将详细解释归并排序算法在C/C++中的实现方式,并尝试从提供的部分代码片段中解析可能存在的逻辑与应用场景。 ### 归并排序算法简介 归并排序是一种采用分治策略(Divide and Conquer)的排序...

    快速排序算法以及归并算法

    ### 归并排序算法 归并排序是一种稳定的排序算法,同样基于分治法。它将数组分成两半,递归地排序每一半,然后将两个已排序的半数组合并成一个有序数组。 #### Java 实现代码分析 `Project17_Merge` 类展示了归并...

    快速排序与归并排序比较(C++).rar_c++paixusuanfa_归并_归并排序_归并排序算法

    快速排序和归并排序是两种常用的排序算法,它们在计算机科学和编程中有着广泛的应用。本文将详细讨论这两种排序算法的原理、实现方式以及性能对比。 快速排序是一种由C.A.R. Hoare在1960年提出的分治算法。其基本...

    C语言算法之归并排序C语言算法之归并排序

    归并排序是一种基于**分而治之**策略的经典排序算法。它将一个数组分成两半,递归地对每一半进行排序,然后将排序后的两部分合并成一个有序数组。 #### 二、归并排序的基本步骤 归并排序主要由两个关键步骤组成: ...

    根号n段归并排序算法时间复杂度分析过程

    根号n段归并排序算法是一种优化过的归并排序策略,它的主要目标是减少比较和交换操作的次数,从而在处理大数据集时提高效率。在传统的归并排序中,我们将数组分为两个子数组,然后递归地对它们进行排序,最后合并两...

Global site tag (gtag.js) - Google Analytics