`
liugang594
  • 浏览: 987603 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

排序算法的比较

阅读更多

无聊的时候就想测测java中排序算法的性能。

 

当然,性能也和实现有关系。所以不能绝对的看结果。同样的排序算法,很多牛人写的性能就要更好些,我的就差很多。

 

这里我比较了两种排序算法:插入排序和分治排序

 

首先先看插入排序算法。实现如下:

 

描述:假设i元素之前的元素已经是有序的,现在用i和之前的元素比较,找到适当的位置插入,将i之前的其他元素后移。

 

	public static int[] insertSorter(int[] values) {
		for (int i = 1; i < values.length; i++) {
			int tmp = values[i];
			int j;
			for (j = i; j > 0 && values[j - 1] > tmp; j--) {
				values[j] = values[j - 1];
			}
			values[j] = tmp;
		}
		return values;
	}

 

然后看看分治排序。分两种方式:递归和非递归。

 

递归描述:把递归的把待排序数组分成两组,分别排序,然后再按序组合。

	//分治法,递归
                public static int[] recursionDimSorter(int[] values) {
		return recursionDimSorter(values, 0, values.length);
	}
                
	private static int[] recursionDimSorter(int[] values, int startIndex,
			int endIndex) {
		if (endIndex - startIndex == 1) {
			return values;
		}
		int middle = startIndex + (endIndex - startIndex) / 2;
		recursionDimSorter(values, startIndex, middle);
		recursionDimSorter(values, middle, endIndex);
		return mergeArrays(values, startIndex, endIndex, middle);
	}

                //合并已经排序的前后两组
	private static int[] mergeArrays(int[] values, int startIndex,
			int endIndex, int middleIndex) {
		// check index
		if (middleIndex < startIndex || middleIndex > endIndex
				|| values.length <= startIndex || values.length < endIndex
				|| startIndex < 0 || endIndex < 0 || middleIndex < 0) {
			throw new ArrayIndexOutOfBoundsException();
		}

		//merge
		int[] first = new int[middleIndex - startIndex];
		int[] second = new int[endIndex - middleIndex];
		System.arraycopy(values, startIndex, first, 0, first.length);
		System.arraycopy(values, middleIndex, second, 0, second.length);

		for (int i = startIndex, j = 0, k = 0; i < endIndex; i++) {
			if (k == second.length) {
				System.arraycopy(first, j, values, i, first.length - j);
				break;
			} else if (j == first.length) {
				System.arraycopy(second, k, values, i, second.length - k);
				break;
			}
			values[i] = first[j] > second[k] ? second[k++] : first[j++];
		}
		return values;
	}

 

 

非递归描述:递归的反思路:先两两一组比较,再四四一组比较,以此向上。

 

	public static int[] unrecursionDimSorter(int[] values) {
		int step = 1;
		while (step < values.length) {
			step *= 2;
			for (int i = 0; i < values.length; i += step) {
				int endIndex = i + step >= values.length ? values.length : i
						+ step;
				int middleIndex = i + step / 2 >= values.length ? values.length - 1
						: i + step / 2;
				values = mergeArrays(values, i, endIndex, middleIndex);
			}
		}
		return values;
	}

 这里使用step去描述步调。一开始是一一比,然后合成二;然后二二比合成四;。。。;以此类推。

 

最后我们看一下对比结果(这里数组都是通过随机数产生的):

 

先看一个小数组,数量级只有100:

 

start recursion
    unsorted:2079873
    sorted:    175162
start unrecursion
    unsorted:930565
    sorted:    46096
start insert
    unsorted:91353
    sorted:    345575

 这里我都只运行了一次,所以可能结果不太能说明问题。不过总体上来说此时无序和有序,插件排序表现都很好;递归分治在两种情况下表现都较差。

 

再看一个大数组,数组级为10万:

 

start recursion
         unsored:234316652
         sorted:   157530357
start unrecursion
         unsored:214810541
         sorted:   158534674
start insert
         unsored:152853701518
         sorted:   3797131

 

可以看到,分治法表现比较好,很快就完成了运算,而插件法去慢得多,从结果看,多出了三个数量级。不过在有序的情况下刚表现最为出色。

 

 

 

分享到:
评论

相关推荐

    内部排序算法比较 课程设计

    【内部排序算法比较课程设计】主要关注的是对六种经典的内部排序算法的性能对比,包括起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序和堆排序。这些算法是计算机科学中用于对数据进行排序的基础工具,各...

    内部排序算法比较

    《内部排序算法比较》 【问题描述】 在教科书中,各种内部排序算法的时间复杂度分析结果只给出算法的大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以获得直观感受 【基本要求】 (1)...

    内部排序算法比较 数据结构课程设计

    1、本演示程序对以下6种常用的内部排序算法进行实测比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。 2、待排序表的表的元素的关键字为整数,表长不小于100;其中的数据要用伪随机数产生...

    实验7: 内部排序算法比较.doc

    实验7: 内部排序算法比较.doc 实验7: 内部排序算法比较.doc 实验7: 内部排序算法比较.doc

    数据结构课程设计(内部排序算法比较).

    数据结构课程设计中的内部排序算法比较是一个非常重要的主题。它主要涵盖了各种内部排序算法的特点、应用场景以及它们之间的性能差异等内容。 ### 内部排序算法概述 #### 什么是内部排序算法? 内部排序算法是指...

    各种排序算法比较(java实现)

    `Algorithm.java`文件可能包含了这些排序算法的Java实现代码,而`常见排序算法的实现与性能比较.doc`文档则可能详细比较了这些算法的性能和适用场景。`readme.txt`文件可能是对整个项目的简要说明,包括如何运行和...

    各种排序算法比较

    时间复杂度用于衡量排序算法的效率,通常以大O表示法来表示。文档中提到了几种不同排序算法的时间复杂度: - **O(n²)**:插入排序、冒泡排序和选择排序的时间复杂度均为O(n²),这意味着随着数据量的增加,这些...

    数据结构课程设计(内部排序算法比较_C语言)

    ### 数据结构课程设计:内部排序算法比较_C语言 #### 一、课题背景与意义 排序作为数据结构中的重要组成部分,在实际开发中具有广泛的应用场景。理解不同排序算法的特点及其适用场景,对于提高程序效率和解决问题...

    内排序算法比较,六种排序算法分析

    题目一: 内排序算法比较 1) 对以下6种常用的内部排序算法进行比较:起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序。 2) 待排序记录的文件个数不小于1000( 其数据用伪随机数产生),至少用5组...

    内部排序法比较.rar

    本压缩包"内部排序法比较.rar"提供了对几种常见内部排序算法的分析和实现,包括"sort.cpp"源代码文件以及"内部排序算法比较.doc"文档,用于深入理解各种排序算法的原理和性能特点。 1. 内部排序法概述: 内部排序是...

    排序算法比较 C实现

    此设计题目要求了解掌握各种排序算法、分析其优劣。故设计总体框架如下:定义一个主函数,在主函数中定义一个长度MAXSIZE=31000的数组,存放随机数。 在主函数中,定义该线性表的初始长度为零,并调用为该一维顺序...

    数据结构课程设计---排序算法比较

    数据结构课程设计,C语言,七大排序算法比较

    内部排序算法比较,C语言

    要求对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。待排序表的表长不小于1000;其中的数据要用伪随机数产生程序产生,至少要用5组不同的输入数据作比较...

    数据机构综合课设内部排序算法比较.docx

    本篇文章将深入探讨10种常见的内部排序算法,包括它们的基本思想、比较次数和移动次数的计算,以便更直观地理解不同算法的效率。 1. **直接插入排序**: 直接插入排序是一种简单的排序算法,它通过比较新元素与已...

    内排序算法比较

    1) 对以下 6 种常用的内部排序算法进行比较:起泡排序,直接插入排序,简单选择排 序,快速排序,希尔排序,堆排序。 2) 待排序记录的文件个数不小于 1000( 其数据用伪随机数产生 ),至少用5 组不同的 输入数据作...

    算法分析与设计 排序算法比较

    算法分析与设计排序算法比较 通过对各种排序算法的思想、算法的分析,探究它的使用范围以及时间复杂度和空间复杂度。 冒泡排序算法 冒泡排序算法思想简单描述:在要排序的一组数中,对当前还未排好序的范围内的...

Global site tag (gtag.js) - Google Analytics