`

Java中几种常用排序的实现与比较

 
阅读更多

关于排序的算法,大约分为两大类:顺序排序与对数排序。
         顺序排序一般使用一对嵌套的循环结构(多为两个for循环),因此排序n个元素需要大约n的2次方的比较。比较常用的顺序排序有(1)选择排序法 (2)插入排序法 (3)冒泡排序法
         对数排序一般需要大约n*log2n(2为底数)次比较。这两种排序,当n越大的时候,他们性能上的差别就越大。快速排序与归并排序都属于对数排序,同样是使用递归。



1)选择排序法

Java代码  收藏代码
  1. public class Sort {  
  2.   
  3.     // 选择排序  
  4.     public static void selectionSort(Comparable[] data) {  
  5.         int min;  
  6.         Comparable temp;  
  7.         // 从第一个元素开始比较,找出最小那个,放在第一位  
  8.         // 从第二个元素开始比较,找出最小那个,放在第二位  
  9.         // 总共需要放N-1次  
  10.         for (int index = 0; index < data.length - 1; index++) {  
  11.             min = index;  
  12.             for (int scan = index + 1; scan < data.length; scan++) {  
  13.                 if (data[scan].compareTo(data[min]) < 0) {  
  14.                     min = scan;  
  15.                 }  
  16.             }  
  17.             //跳回到第一层循环的时候,才进行交换,把最小的数放在第一位...如此类推  
  18.             temp = data[min];  
  19.             data[min] = data[index];  
  20.             data[index] = temp;  
  21.   
  22.         }  
  23.     }  
  24. }  


策略是:搜索整个数组,找到最小值。然后将这个值与第一个位置上的值交换。然后搜索除第一个值钱外的次小值,然后与第二个位置上的值进行交换。如此类推。这种算法最简单易明


2)插入排序

Java代码  收藏代码
  1. // 插入排序  
  2. public static void insertionSort(Comparable[] data) {  
  3.     // 插入一个数,与前面的数比较,放到适当的位置,如此类推  
  4.     for (int index = 1; index < data.length; index++) {  
  5.         Comparable temp = data[index];  
  6.   
  7.         int position = index;  
  8.   
  9.         while (position > 0 && data[position - 1].compareTo(temp) > 0) {  
  10.   
  11.             data[position] = data[position - 1];  
  12.             position--;  
  13.         }  
  14.         data[position] = temp;  
  15.     }  
  16. }  


插入排序相对于选择排序要复杂一些,策略是:每插入一个数,与前面的所有数进行比较, 然后把这个数放到适当的位置。比如:数组里只有3,插入6,3与6排序后,插入4,然后4就放到第2位,之后插入5,3与4位置不变,5放在第3位,6换 到第4位...插入的过程需要移动数组的其他值,为插入的元素腾出存储空间。


3)冒泡算法

Java代码  收藏代码
  1. public static void bubbleSort2(Comparable[] data) {  
  2.   
  3.     Comparable temp;  
  4.   
  5.     for (int i = 0; i < data.length; i++) {  
  6.         for (int j = 0; j < data.length - 1 - i; j++) {  
  7.             if (data[j].compareTo(data[j + 1]) > 0) {  
  8.                 temp = data[j + 1];  
  9.                 data[j + 1] = data[j];  
  10.                 data[j] = temp;  
  11.             }  
  12.         }  
  13.     }  
  14. }  


冒泡算法大家应该最熟悉了...它的策略是:第一次对数组所有值进行比较,重复地比较相邻两个元素,比较后进行交换,把最大值移动到最后一个位置,然后再扫描除最后一位外的数组其他值,不断进行交换,把次大值移到倒数第2位,如此类推。每次比较都找出该次所有数中的最大值



上面3种顺序排序实现都很相似,效率也接近
现在看看如何使用递归实现排序
4)快速排序

Java代码  收藏代码
  1. public static void quickSort(Comparable[] data, int min, int max) {  
  2.     int mid;  
  3.   
  4.     if (min < max) {  
  5.         mid = findPartition(data, min, max);  
  6.         quickSort(data, min, mid - 1);  
  7.         quickSort(data, mid + 1, max);  
  8.     }  
  9. }  
  10.   
  11. // quickSort的支撑方法  
  12. private static int findPartition(Comparable[] data, int min, int max) {  
  13.     int left;  
  14.     int right;  
  15.     Comparable temp;  
  16.     Comparable partitionelement;  
  17.   
  18.     // 以第一个元素为分割元素(不一定是data[min])  
  19.     partitionelement = data[min];  
  20.   
  21.     left = min;  
  22.     right = max;  
  23.   
  24.     while (left < right) {  
  25.   
  26.         // 从左边找到比partitionelement大的数就跳出循环  
  27.         while (data[left].compareTo(partitionelement) <= 0 && left < right) {  
  28.             left++;  
  29.         }  
  30.   
  31.         // 从右边找到比partitionelement小的数就跳出循环  
  32.         while (data[right].compareTo(partitionelement) > 0) {  
  33.             right--;  
  34.         }  
  35.   
  36.         // 交换左边比partitionelement大的与右边比partitionelement小的元素  
  37.         if (left < right) {  
  38.             temp = data[left];  
  39.             data[left] = data[right];  
  40.             data[right] = temp;  
  41.         }  
  42.     }  
  43.   
  44.     // 当left>=right的时候,交换分割元素与data[right]的位置(把分割元素放到去一个比较中间的位置)  
  45.     temp = data[min];  
  46.     data[min] = data[right];  
  47.     data[right] = temp;  
  48.   
  49.     return right;  
  50. }  


策略:首先在数组中任意选择一个元素作为分割元素,上面的例子是选择第一个数。然后开 始分割数组,把比这个分割元素小的值都移到它的左边,比他大的都移到它的右边。然后递归调用这个方法,对左右两部分排序,类似地从左边选择一个分割元素, 把左边比它小的排在它的左边,比它大的排在它的有...然后到右边。直到只剩下一个元素时(即不能再分割时)完成排序。
这种排序需要3个参数,第一个为对象数组,第2个是数组索引的起始位置,第3个是数组索引的结束位置。




下面对这几种排序的实现和性能进行测试

Java代码  收藏代码
  1. public static void main(String[] args) {  
  2.     long start = System.currentTimeMillis();  
  3.   
  4.         Random rand = new Random();     
  5.        
  6.         Integer array[] = new Integer[40000];  
  7.           
  8.         for(int i=0;i<40000;i++){  
  9.             array[i] = rand.nextInt(10);  
  10.         }  
  11.   
  12.         // 插入排序  
  13.         // insertionSort(array);  
  14.   
  15.         // 选择排序  
  16.         // selectionSort(array);  
  17.   
  18.         // 冒泡排序  
  19.         // bubbleSort(array);  
  20.   
  21.         // 快速排序  
  22.            quickSort(array, 039999);  
  23.              
  24.            
  25.         System.out.println(Arrays.toString(array));  
  26.   
  27.     long end = System.currentTimeMillis();  
  28.   
  29.     System.out.println("时间差:" + (end - start) + "毫秒");  
  30. }  



结论:
对有4万个(1~9)随机数的数组进行排序,在我的机器上运行,使用递归的快速查询约1秒,插入查询用5秒左右,选择查询11秒+,冒泡算法要几乎14秒。当然要查询的对象越少,他们之间效率的差别就越小。在排序对象的数量不多时,用顺序查询会比较方便与直观。

分享到:
评论

相关推荐

    Java实现几种常见排序方法

    ### Java 实现几种常见排序方法 #### 泡泡排序(Bubble Sort) 泡泡排序是一种简单的排序算法,它重复地遍历待排序的数列,依次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复...

    用Java实现几种常见的排序算法

    根据提供的文件信息,本文将详细介绍如何使用Java语言来实现几种常见的排序算法,包括插入排序(Insert Sort)、冒泡排序(Bubble Sort)、选择排序(Selection Sort)以及希尔排序(Shell Sort)。这些排序算法在...

    Java几种常见的排序方法

    Java中几种比较常见的排序方法,像冒泡、快速排序、插入排序登。

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

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

    用Java实现几种常见的排序算法.txt

    根据提供的文件信息,我们可以总结出该文档主要涉及了五种基于Java实现的排序算法:插入排序(Insert Sort)、冒泡排序(Bubble Sort)、选择排序(Selection Sort)、希尔排序(Shell Sort)以及快速排序(Quick ...

    常用排序算法的java实现(冒泡、插入、选择、希尔、归并、快排)

    本篇文章将详细讲解标题中提到的六种常见排序算法的Java实现。 1. **冒泡排序**:冒泡排序是最基础的排序算法之一,它通过不断交换相邻的逆序元素来逐渐将较大的元素“浮”到数组的前端。在Java中,冒泡排序的基本...

    JAVA几种常用的排序算法

    JAVA几种常用的经典的排序算法 冒泡 选择 快速 shell 堆排序

    Java实现几种常见的排序算法

    本文将详细探讨Java中实现几种常见的排序算法,包括它们的工作原理、时间复杂度以及如何在实际代码中应用。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个...

    java实现数据结构常见排序算法及详解

    ### Java 实现数据结构常见排序算法及详解 #### 排序算法概述 排序算法是计算机科学中的基础概念之一,主要用于将一系列数据按照特定规则进行排列。根据数据处理方式的不同,排序算法大致分为两大类:比较排序与非...

    java最常见的几种排序

    java排序算法,包括冒泡、插入、快速、选择等四种最常见的排序算法

    Java几种常见的排序算法

    Java几种常见的排序算法

    几种常见排序算法JAVA实现.pdf

    几种常见排序算法JAVA实现.pdf

    常用排序算法java演示

    首先,让我们逐一了解几种常见的排序算法: 1. **冒泡排序(Bubble Sort)**:这是一种简单的交换排序,通过重复遍历数组,比较相邻元素并根据需要交换它们,直到没有任何一对数字需要交换。Java中实现冒泡排序的...

    几种常用的排序法 java程序

    本资源包含了一些常见的排序算法的Java实现,包括快速排序、堆排序和归并排序。下面将对这些排序算法进行详细介绍,并探讨它们的原理、优缺点以及适用场景。 1. 快速排序(Quick Sort) 快速排序是一种分治策略的...

    java 几种常用的排序算法

    ### Java几种常用的排序算法 在Java编程语言中,排序算法是数据处理中不可或缺的一部分,它不仅可以帮助我们组织数据,还能提高程序效率。本篇文章将详细介绍几种常用的Java排序算法:选择排序、冒泡排序以及插入...

Global site tag (gtag.js) - Google Analytics