-
测试排序的效率,为什么:希尔排序>归并排序>快速排序?20
我看看几篇排序的算法的文章,大家都说效率一般都是:快速排序>归并排序>希尔排序
然后就用java自己动手测了一下,测试结果却是:希尔排序>归并排序>快速排序
而且当数据量过大时,归并排序 和 快速排序 会出现栈溢出.
以下是我写的源代码,请帮我分析一下是什么原因?
package com.test; import java.util.Arrays; import java.util.Random; public class Sort { public static void main(String[] args) { int[] arr = new int[400000]; Random r = new Random(); long start, end; init(arr, r); System.out.print("希尔排序..."); start = System.currentTimeMillis(); sort1(arr); end = System.currentTimeMillis(); System.out.println("完成" + (end - start)); //System.out.println(Arrays.toString(arr)); init(arr, r); System.out.print("归并排序..."); start = System.currentTimeMillis(); arr = sort2(arr, 0, arr.length - 1); end = System.currentTimeMillis(); System.out.println("完成" + (end - start)); //System.out.println(Arrays.toString(arr)); init(arr, r); System.out.print("快速排序..."); start = System.currentTimeMillis(); sort3(arr, 0, arr.length - 1); end = System.currentTimeMillis(); System.out.println("完成" + (end - start)); //System.out.println(Arrays.toString(arr)); } /** * 初始化 */ private static void init(int[] arr, Random r) { System.out.print("\n初始化..."); for (int i = 0; i < arr.length; i++) { arr[i] = r.nextInt(100); } //System.out.println("\n" + Arrays.toString(arr)); } /** * 希尔排序 */ private static void sort1(int[] a) { int i, j, temp, increment; // increment增量缩短,当增量为1时,即把整个数组进行插入排序 for (increment = a.length / 3; increment > 0; increment /= 3) { for (i = increment; i < a.length; i++) { temp = a[i]; for (j = i - increment; j >= 0 && temp < a[j]; j -= increment) { a[j + increment] = a[j]; } a[j + increment] = temp; } } } /** * 归并排序 * left,right参数表示:把a数组中fist--right之间的元素排序 * 排序结果以新数组返回. */ private static int[] sort2(int[] a, int left, int right) { //判断递归结束条件 if (right <= left) return new int[] { a[left] }; //从数组中间切成左右两部分,mid为右边部分的起始下标 int mid = (left + right + 1) / 2; //第一步:用递归把数组左边排序 int[] a1 = sort2(a, left, mid - 1); //第二步:用递归把数组右边排序 int[] a2 = sort2(a, mid, right); //第三步:归并操作,把左右两边序列合并到新的数组 int[] result = new int[right - left + 1]; int i = 0, j = 0, k = 0; while (i < a1.length && j < a2.length) { if (a1[i] < a2[j]) result[k++] = a1[i++]; else result[k++] = a2[j++]; } while (j < a2.length) { result[k++] = a2[j++]; } while (i < a1.length) { result[k++] = a1[i++]; } return result; } /** * 快速排序 * left,right参数表示:把a数组中left--right之间的元素排序 */ private static void sort3(int[] a, int left, int right) { // 第四步:判断结束递归的条件 if(left>=right) return; // 第一步:以left为基数,把a分成左右两部分,使左边部分小于右边部分 int i = left;//最终i==j; for (int b=1,j=right; i < j;) {// 最初b=1,表示以left为基数 if (a[i] > a[j]) {//交换位置 int temp = a[i]; a[i] = a[j]; a[j] = temp; if (b==1) i++; else j--;//应基数位置不同,处理也不同 b = -b;//交换位置后,基数位置变化,b=1,表示以left为基数 } else { if (b==1) j--; else i++;//应基数位置不同,处理也不同 } } // 第二步:递归排序左部分(left到i-1) sort3(a,left,i-1); // 第三步:递归排序右部分(i+1到right) sort3(a,i+1,right); } }
运行结果如下:
初始化...希尔排序...完成40
初始化...归并排序...完成53
初始化...快速排序...完成14112012年5月26日 15:14
相关推荐
以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...
1. 快速排序:由C.A.R. Hoare提出,是一种采用分治策略的高效排序算法。其核心思想是选取一个基准元素,将数组分为两部分,一部分的所有元素都比基准小,另一部分的所有元素都比基准大,然后对这两部分递归进行快速...
这七种算法分别是:冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序和快速排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻元素并交换位置来实现排序...
7. 快速排序:快速排序由C.A.R. Hoare提出,采用分治策略,选取一个基准元素,将数组分为两部分,一部分所有元素小于基准,另一部分所有元素大于基准,然后对这两部分分别进行快速排序。平均时间复杂度为O(n log n)...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
下面将详细讲解这7种排序算法:快速排序、归并排序、插入排序、选择排序、冒泡排序、堆排序以及希尔排序。 1. **快速排序**:由C.A.R. Hoare提出的,采用分治策略。基本思想是选取一个基准元素,通过一趟排序将待...
快速排序、堆排序、归并排序和希尔排序是四种经典的排序算法,它们在计算机科学中有着广泛的应用。这里我们将深入探讨这些排序算法的原理、实现方式以及它们在C++编程中的应用。 **快速排序(Quick Sort)** 快速...
本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年提出,是一种改进的插入排序。它的基本思想是通过设置一个增量序列,将待排序的元素按照...
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht
本资料包聚焦于三类时间复杂度为O(nlogn)的经典排序算法:希尔排序、快速排序和归并排序。接下来,我们将深入探讨这三种算法的原理、实现及其优缺点。 **希尔排序(Shell Sort)** 希尔排序是一种改进的插入排序,...
这里我们将深入探讨六种基本的排序算法:冒泡排序、插入排序、选择排序、希尔排序、堆排序以及归并排序,这些都是快速排序算法的基础。下面,我们将逐一介绍这些算法的工作原理、效率特点及其应用场景。 1. **冒泡...
//值为3,快速排序 case 4: SelectSort(R); break; //值为4,直接选择排序 case 5: HeapSort(R); break; //值为5,堆排序 case 6: MergeSort(R); break; //值为6,归并排序 case 7:ShellSort(R); break; //值为...
各种基本排序方法(直接插入、希尔、直接选择、冒泡、快速、堆、二路归并)的大致原理和过程、复杂性和稳定性、相应算法的程序段;
本篇将详细探讨快速排序、希尔排序和归并排序这三种在C语言中常见的排序算法。 首先,我们来看快速排序(Quick Sort)。快速排序由C.A.R. Hoare在1960年提出,其基本思想是分治法。它的核心是选择一个基准元素,...
例如,插入排序和选择排序适合小规模数据,冒泡排序简单但效率低,希尔排序对大规模数据有优势,归并排序稳定但需要额外空间,快速排序在大多数情况下高效。在编程实践中,根据具体需求选择合适的排序算法是非常重要...
希尔排序的时间复杂度取决于增量序列的选择,通常比简单插入排序更快,但不如其他高效的排序算法(如快速排序、归并排序)。 这些排序算法各有优缺点,选择哪种算法取决于具体的应用场景。例如,对于小规模数据或...
C语言所有排序大全,解决了您日常上课考试学习的需要,在这里每一个程序都没有错误,其中压缩包包括了归并排序;基数排序;快速排序;冒泡排序;选择排序;折半排序;希尔排序这些日常排序,因为是全集所以大家踊跃...
根据给定的信息,本文将对九种不同的排序算法进行详细解析:选择排序、插入排序、冒泡排序、希尔排序、快速排序、箱子排序(计数排序)、基数排序、归并排序以及堆排序。 ### 一、选择排序 选择排序的基本思想是...
本主题涵盖了六种经典的排序算法:希尔排序、堆排序、快速排序、简单选择排序、插入排序和冒泡排序。这些算法各有特点,适用于不同的场景,下面将逐一详细介绍。 1. **希尔排序**:希尔排序是由Donald Shell提出的...