冒泡和归并排序是两种常用的排序方法,实际应用中性能差别有多大呢,通过如下有两个小测试可以看到它们之间大概的差距。
需求:
对10000个员工根据编号排序,员工编号以A开头。由于各公司分别编号,员工编号可以重复。
util类:
public class SortUtil { private static final int EMP_NUMBER = 10000; public static void swap(Employee[] employees, int i, int j){ Employee temp = employees[i]; employees[i] = employees[j]; employees[j] = temp; } public static Employee[] createEmployees(){ long start = System.currentTimeMillis(); Employee[] employees = new Employee[EMP_NUMBER]; for(int i = 0; i < EMP_NUMBER; i++){ employees[i] = new Employee(); employees[i].setEmNO("A"+ String.valueOf((int)(Math.random() * 1000))); } System.out.println("~~~~~~~~ createEmployees() Time elapsed : "+ (System.currentTimeMillis() - start)); return employees; } }
2路归并排序:
/** * 对10000个员工号码进行排序 * 归并排序 * * @author Administrator * */ public class TestSortMergeEmployee { private static Employee[] employees = null; public void mergeSort(Employee[] array) { if(employees == null || employees.length == 0 || employees.length == 0) throw new RuntimeException("******** Array is null or Empty!"); long start = System.currentTimeMillis(); Employee[] temp = new Employee[array.length]; mSort(array, temp, 0, array.length - 1); System.out.println("~~~~~~~~ Merge sort time elapsed : "+ (System.currentTimeMillis() - start)); } private void mSort(Employee[] a, Employee[] temp, int first, int last) { if (first < last) { int mid = (first + last) / 2; mSort(a, temp, first, mid); mSort(a, temp, mid + 1, last); merge(a, temp, first, mid, last); } } private void merge(Employee[] a, Employee[] temp, int first, int mid, int last) { int i = first; int j = mid + 1; int m = mid; int n = last; int k = 0; while (i <= m && j <= n) { //if (a[i] < a[j]) if(a[i].compareTo(a[j]) < 0) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i]; } public static void main(String[] args) { TestSortMergeEmployee sortEmployees = new TestSortMergeEmployee(); employees = SortUtil.createEmployees(); sortEmployees.mergeSort(employees); /*for(int i = 0; i < employees.length; i++){ System.out.println(employees[i].getEmNO()); }*/ } }
冒泡排序:
/** * 对100000个员工号码进行排序 * 冒泡排序 * * @author Administrator * */ public class TestSortBubbleEmployees { private static Employee[] employees = null; public Employee[] sortBuddle(Employee[] employees){ if(employees == null || employees.length == 0 || employees.length == 0) return employees; int length = employees.length; long start = System.currentTimeMillis(); for(int i = 0; i < length; i++){ for(int j = length - 1; j > i + 1; j--){ if(employees[i].compareTo(employees[j]) > 0) SortUtil.swap(employees, i, j); } } System.out.println("~~~~~~~~ Bubble sort time elapsed : "+ (System.currentTimeMillis() - start)); return employees; } /** * @param args */ public static void main(String[] args) { TestSortBubbleEmployees sortEmployees = new TestSortBubbleEmployees(); employees = SortUtil.createEmployees(); Employee[] rtnEmployees = sortEmployees.sortBuddle(employees); /*for(int i = 0; i < rtnEmployees.length; i++){ System.out.println(rtnEmployees[i].getEmNO()); }*/ } }
测试结果:
归并排序:
~~~~~~~~ Merge sort time elapsed : 40
冒泡排序:
~~~~~~~~ Bubble sort time elapsed : 11390
测试结论:
虽然测试环境等因素会影响测试结果,但以上测试结果可以初步证明冒泡排序和归并排序性能差距比较大,大约相差200倍左右。究其原因,冒泡排序移动次数太多了,造成用时较多。
如果按照以上的代码进行测试,当员工增长到10万人时,冒泡排序程序运行几分钟也排不完。如果排序超大数据集时,用时之久可想而知。
因此,虽然冒泡算法是很基础的算法,并且具备比较简单和容易编写等特点,但可用性太差,建议大多数情况下,应该回避该算法。
相关推荐
3. 基数排序:一种非比较型排序,基于每一位上的数字进行排序,适用于整数排序。时间复杂度为O(n*k),其中k为数字的最大位数。 4. 堆排序:利用堆这种数据结构进行排序,分为建堆和调整堆两个过程。时间复杂度在...
冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻元素并交换位置来实现排序。如果前一个元素大于后一个元素,它们就会交换位置,这样最大的元素会逐渐"冒泡"到序列末尾。时间复杂度为O(n^2)。 2...
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht
2. 冒泡排序:是最简单的排序算法之一,通过不断交换相邻位置的元素来逐渐达到排序的目的。每一轮遍历都能确保最大(或最小)的元素被放置到正确的位置,重复这个过程直到整个数组排序完成。 3. 选择排序:每次从未...
Hoare提出的,是目前应用最广泛的排序算法之一。它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列...
1. **直接插入排序**:直接插入排序是最基础的排序算法之一。它的工作原理是将待排序的元素逐个与已排序的部分进行比较,找到合适的位置插入。这种算法对于小规模或部分有序的数据集表现较好,但对于大规模无序数据...
各种排序算法的实现函数:包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。 查找最大最小值函数 findMinMax:在给定数组中查找最大值和最小值。 计算平均值...
本文将详细探讨五种常见的排序算法——归并排序、插入排序、冒泡排序和选择排序,以及它们在C语言环境下的时间性能比较。 1. **归并排序**: 归并排序是一种基于分治策略的排序算法,它将大问题分解为小问题,再将...
本文将深入探讨“C语言数据结构内部排序算法及比较”这一主题,结合个人课程作业的经验,对一些核心概念进行阐述,并对常见的内部排序算法进行比较。 首先,数据结构是组织和管理数据的方式,它包括数组、链表、树...
快速排序是最著名的内部排序算法之一,由分治策略实现。通过选择一个基准值并将数组分为两部分,使得一部分的所有元素小于另一部分。快速排序的平均时间复杂度为O(n log n),但在最坏情况下为O(n^2)。 7. **简单...
在计算机科学领域,排序算法是数据处理中至关重要的一部分,它涉及到如何有效地组织和排列一系列元素。以下是关于标题和描述中提到的六种排序算法的详细解释: 1. 插入排序(Insertion Sort): 插入排序是一种...
直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...
十个基础排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、桶排序、计数排_SortAlgorithm
- 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 - C++实现时...
本文将深入探讨C#中常见的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序,以及它们的实现细节和应用场合。 首先,我们来看**冒泡排序**。冒泡排序是一种简单的交换排序方法,它通过不断比较相邻元素并交换...
冒泡排序是最简单的排序算法之一,通过比较相邻元素并交换位置来实现排序。每一轮遍历会确保最大的元素“冒”到数组的末尾。这个过程会重复,直到所有元素都排好序。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1...
在实际编程中,Java提供了一个内置的`Arrays.sort()`方法,它使用了更高效的排序算法,如快速排序、归并排序等,对于大数据集,效率远高于冒泡排序和选择排序。`Arrays.sort()`可以轻松地对数组或列表进行升序或降序...
快速排序和冒泡排序是两种常见的排序算法,它们在计算机科学中扮演着重要的角色,特别是在数据处理和优化程序性能方面。本篇文章将深入探讨这两种排序算法的原理、效率以及它们在C#编程语言中的实现。 首先,让我们...
5. 冒泡排序:冒泡排序是最基础的排序算法之一,通过不断交换相邻的逆序元素,使得大元素逐渐“冒”到数组末尾。最坏情况下的时间复杂度为O(n²)。 6. 双向冒泡排序:双向冒泡排序是对传统冒泡排序的改进,同时从两...
本篇文章主要探讨了如何在VC++环境中利用多线程技术来实现三种经典的排序算法:冒泡排序、快速排序和归并排序,并对它们的性能进行了比较。 首先,冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次...