今天上班没有什么事情需要处理,昨天刚好看在本书上看到归并排序就试着将其代码写了出来。尝试着进行一下分析!感觉从算法的描述到具体的代码,中间有不少细节需要注意。不如到底是小于还是小于等于,是该加一还是减一等等。怪不得有些公司面试时要求进行机试,其实这也是为了考察一个人的动手能了和对细节的处理能力!其实我也不喜欢机试,更别说是有些变态的让直接在纸上写代码的了。。。。
归并排序算法的概念:
归并排序其实是算法里边用的比较多的算法,是“分而治之思想
”的典型应用。其基本思想是,将一些已排序的子文件进行合并得到一个完整的有序文件。归并是只要比较各子文件记录的关键码,其最小者就是全局最小者(相对于参与比较的字文件);取出它后继续比较各子文件的第一个记录....如此下去就能完成排序任务。
实现代码(经过测试):
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).但是这会使的算法的可理解性下降。所以在实际应用时,根据具体的需要选择不同的算法实现。一般情况下对算法的可理解行要求不该,可以使用预创建的辅助数组降低空间开销,但是如果程序对空间开销要求不高,建议使用可理解行高的算法实现。
总结:
一种算法思想可以有不同的实现,实现之间的空间开销和时间开销个不相同。因此我们要根据需要仔细选择算法实现。
分享到:
相关推荐
归并排序算法是一种高效稳定的排序方法,其基本思想源于分治法。该算法将一个大问题分解成两个或更多的小问题来解决,然后再合并这些小问题的解,从而得到最终的大问题的解。在归并排序中,我们将一个大的数组分割成...
### 归并排序算法实现详解 #### 一、引言 归并排序是一种经典的排序算法,采用分治法的思想,将待排序数组分为若干个子序列,这些子序列是已排序的,然后再按照一定的方式合并这些子序列得到最终排序后的数组。...
### C语言二路归并排序算法 #### 概述 归并排序是一种高效的排序算法,其基本思想是采用分治法(Divide and Conquer),将一个数组分成两个子数组,然后递归地对这两个子数组进行排序,最后将两个有序的子数组合并...
在编程领域,排序算法是计算机科学中的重要组成部分,特别是在数据处理和算法效率分析上。本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年...
通过查看和分析这段代码,我们可以更深入地理解归并排序的内部机制,学习如何在实际编程项目中应用这种排序算法。 总结来说,归并排序是一种分治策略的体现,具有稳定且高效的排序性能。它通过递归或迭代的方式分割...
**实验报告:分治法实现归并排序算法** 实验名称:分治法实现归并排序算法 实验日期:年月日 姓名: 学号: 专业班级: ### 一、实验要求 1. **理解分治法**:分治法是一种解决问题的策略,适用于将大问题分解成...
在本资源中,我们主要关注的是使用MATLAB编程语言实现三种经典的排序算法:插入排序、二分归并排序以及归并排序。这些算法是计算机科学基础中的重要组成部分,特别是在算法设计与分析领域。MATLAB是一种强大的数值...
**快速排序与归并排序算法比较实验报告** 在计算机科学中,排序算法是处理大量数据时不可或缺的一部分。这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试...
### 归并排序算法知识点详解 #### 一、归并排序基本概念 归并排序是一种典型的分治策略算法,其核心思想是将待排序的数据序列分成若干子序列,然后对这些子序列进行排序,最后再合并成有序序列。归并排序的时间...
归并排序的复杂性分析: - 时间复杂度:在最好的、最坏的和平均情况下,归并排序的时间复杂度都是O(n log n)。这是因为无论输入数据的初始顺序如何,都需要对n个元素进行log n次划分和合并。 - 空间复杂度:归并排序...
然而,题目中提到的“改进的归并排序算法”探讨了两种不同的实现方式:不回写和非递归。 1. **不回写方式**: 在传统的归并排序中,排序过程中会涉及到数组元素的来回移动。不回写是指在排序过程中避免对原始数组...
快速排序、归并排序、基数排序等排序算法比较,比较时间性能,采用C++语言实现。。。
### 归并排序算法原理 归并排序的基本步骤可以概括为以下几点: 1. **分解**:将待排序的序列分解成尽可能小的子序列,直至每个子序列只有一个元素。由于单个元素的序列自然就是有序的,因此这一步实际上是在准备...
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...
根据给定的信息,本文将详细解释归并排序算法在C/C++中的实现方式,并尝试从提供的部分代码片段中解析可能存在的逻辑与应用场景。 ### 归并排序算法简介 归并排序是一种采用分治策略(Divide and Conquer)的排序...
### 归并排序算法 归并排序是一种稳定的排序算法,同样基于分治法。它将数组分成两半,递归地排序每一半,然后将两个已排序的半数组合并成一个有序数组。 #### Java 实现代码分析 `Project17_Merge` 类展示了归并...
快速排序和归并排序是两种常用的排序算法,它们在计算机科学和编程中有着广泛的应用。本文将详细讨论这两种排序算法的原理、实现方式以及性能对比。 快速排序是一种由C.A.R. Hoare在1960年提出的分治算法。其基本...
归并排序是一种基于**分而治之**策略的经典排序算法。它将一个数组分成两半,递归地对每一半进行排序,然后将排序后的两部分合并成一个有序数组。 #### 二、归并排序的基本步骤 归并排序主要由两个关键步骤组成: ...
根号n段归并排序算法是一种优化过的归并排序策略,它的主要目标是减少比较和交换操作的次数,从而在处理大数据集时提高效率。在传统的归并排序中,我们将数组分为两个子数组,然后递归地对它们进行排序,最后合并两...