`
zhuzhiguosnail
  • 浏览: 110460 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java排序算法【总结】

 
阅读更多

1、冒泡排序

冒泡排序是排序算法中最基本的一种排序方法,该方法逐次比较两个相邻数据的大小并交换位置来完成对数据排序,每次比较的结果都找出了这次比较中数据的最大项,因为是逐次比较,所以效率是O(N^2)的。

[java] view plaincopy
 
  1. public void bubbleSort() {  
  2.         int out,in;  
  3.         for(out=index-1; out>1; --out) {  
  4.             for(in=0; in<out; ++in) {  
  5.                 if(array[in]>array[in+1]) {  
  6.                     swap(in, in+1);  
  7.                 }  
  8.             }  
  9.         }  
  10.     }  
  11.       
  12.     public void swap(int dex1, int dex2) {  
  13.         int temp = array[dex1];  
  14.         array[dex1] = array[dex2];  
  15.         array[dex2] = temp;  
  16.     }  

2、选择排序

 

选择排序对冒泡排序进行了优化,在每次遍历比较的过程中不进行交换,而是记录本次遍历的最小值,在遍历结束后再将最小值移到这次遍历的开始位置。这样虽然比较次数没有改变,但交换的次数大大减少,一共只需要N次交换。因为比较的次数没变,所以效率任然是O(N^2)的。

[java] view plaincopy
 
  1. public void selectionSort() {  
  2.         int out, in;  
  3.         for(out=0; out<index-1; ++out) {  
  4.             int temp = out;  
  5.             for(in=out+1; in<index; ++in) {  
  6.                 if(array[in] < array[temp]) {  
  7.                     temp = in;  
  8.                 }  
  9.             }  
  10.             swap(out, temp);  
  11.         }  
  12.     }  

 

3、插入排序

 

插入排序充分利用已排列好的数据,然后将未排序的数据插入到已排数据的队伍当中,这样每插入一个未排序数据已排队伍都将增加一个成员,最终达到排序的目的。

 

[java] view plaincopy
 
  1. public void insertionSort() {  
  2.         int out ,in;  
  3.         for(out=1; out<index; ++out) {  
  4.             int temp = array[out];  
  5.             in = out;  
  6.             while(in>0 && temp<array[in-1]) {  
  7.                 array[in] = array[in-1];  
  8.                 --in;  
  9.             }  
  10.             array[in] = temp;  
  11.         }  
  12.     }  

 

4、归并排序

归并排序是将两个有序数组合并为一个有序数组的排序,应用在一般排序上要结合二分法递归地将数组依次归并,最终得到一个大的有序数组。归并的效率是O(NlogN)的,但要额外开辟一个数组来存放临时数据,所以占用空间要大一倍。

 

[java] view plaincopy
 
  1. public void mergeSort() {  
  2.         int[] newArray = new int[index];  
  3.         recMergeSort(newArray, 0, index-1);  
  4.           
  5.     }  
  6.       
  7.     private void recMergeSort(int[] data, int low, int upper) {  
  8.         if(low == upper) {  
  9.             return;  
  10.         }  
  11.         int mid = (low + upper)/2;  
  12.         recMergeSort(data, mid+1, upper);  
  13.         recMergeSort(data, low, mid);  
  14.         merge(data, low, mid+1, upper);  
  15.     }  
  16.       
  17.     private void merge(int[] data, int lowStart, int highStart, int upperBound) {  
  18.         int j = 0;  
  19.         int lowBound = lowStart;  
  20.         int mid = highStart - 1;  
  21.         int num = upperBound - lowStart + 1;  
  22.           
  23.         while(lowStart<=mid && highStart<=upperBound) {  
  24.             if(array[lowStart] < array[highStart]) {  
  25.                 data[j++] = array[lowStart++];  
  26.             } else {  
  27.                 data[j++] = array[highStart++];  
  28.             }  
  29.         }  
  30.           
  31.         while(lowStart<=mid) {  
  32.             data[j++] = array[lowStart++];  
  33.         }  
  34.           
  35.         while(highStart<=upperBound) {  
  36.             data[j++] = array[highStart++];  
  37.         }  
  38.           
  39.         for(j=0; j<num; j++) {  
  40.             array[lowBound+j] = data[j];  
  41.         }  
  42.     }  

 

5、希尔排序

希尔排序是一种高级排序,它是由插入排序进化来的,插入排序是将未排的数据依次与前面已排好的数据进行比较移动,这样如果一个较小的数排在靠后的位置,那么要找到这个数的正确位置就要进行较多次移动。希尔排序改进了这种方式,它将每次比较的间隔扩大,排过一次之后数据就分阶段有序了,之后逐渐缩小这个间隔再进行排序。这样做的目的就是让数据一开始可以在一个较大的范围内进行移动,待基本有序后数据的移动量就小了很多。

[java] view plaincopy
 
  1. public void shellSort() {  
  2.         int in, out;  
  3.         int h = 1;  
  4.         int temp;  
  5.         while(h < index/3) {  
  6.             h = h*3+1;  
  7.         }  
  8.         while(h>0) {  
  9.             for(out=h; out<index; ++out) {  
  10.                 temp = array[out];  
  11.                 in = out;  
  12.                 while(in>h-1 && array[in-h] > temp) {  
  13.                     array[in] = array[in-h];  
  14.                     in -=h;  
  15.                 }  
  16.                 array[in] = temp;  
  17.             }  
  18.             h = (h-1)/3;  
  19.         }  
  20.     }  


 

希尔排序中关键是对数据间隔h的选择,一个间隔序列是由Knuth提出的,即h=h*3+1,h的初始值为1,这是希尔排序中最优的间隔序列。

6、快速排序

快速排序是一种广泛使用的排序方法,效率可以达到O(NlogN),快速排序的原理是确定一个中间值pivot,将所有小于pivot的数据放在左侧,大于pivot的值放在右侧,之后再对左右两侧分别采取这种策略进行排序,直到这个过程结束。

[java] view plaincopy
 
  1. private int partition(int left, int right, int pivot) {  
  2.         int leftPtr = left;  
  3.         int rightPtr = right-1;  
  4.         while(true) {  
  5.             while(array[++leftPtr] < pivot) ;  
  6.             while(array[--rightPtr] > pivot);  
  7.             if(leftPtr >= rightPtr) {  
  8.                 break;  
  9.             } else {  
  10.                 swap(leftPtr, rightPtr);  
  11.             }  
  12.         }  
  13.         swap(leftPtr, right-1);  
  14.         return leftPtr;  
  15.     }  
  16.       
  17.     private int median(int left, int right) {  
  18.         int center = (left+right)/2;  
  19.         if(array[left]>array[center]) {  
  20.             swap(left, center);  
  21.         }  
  22.         if(array[left]>array[right]) {  
  23.             swap(left, right);  
  24.         }  
  25.         if(array[center]>array[right]) {  
  26.             swap(center, right);  
  27.         }  
  28.         swap(center, right-1);  
  29.         return array[right-1];  
  30.     }  
  31.       
  32.     private void manulSort(int left, int right) {  
  33.         int size = right-left+1;  
  34.         if(size <= 1return;  
  35.         if(size == 2) {  
  36.             if(array[left]>array[right]) swap(left, right);  
  37.         } else {  
  38.             if(array[left]>array[right-1]) swap(left, right-1);  
  39.             if(array[left]>array[right]) swap(left, right);  
  40.             if(array[right-1]>array[right]) swap(right-1, right);  
  41.         }  
  42.     }  
  43.       
  44.     private void recQuickSort(int left, int right) {  
  45.         int size = right-left+1;  
  46.         if(size<=3) {  
  47.             manulSort(left, right);  
  48.         } else {  
  49.             int pivot = median(left, right);  
  50.             int partition = partition(left, right, pivot);  
  51.             recQuickSort(left, partition-1);  
  52.             recQuickSort(partition+1, right);  
  53.         }  
  54.           
  55.     }  
  56.       
  57.     public void quickSort() {  
  58.         recQuickSort(0, index-1);  
  59.     }  

快速排序的关键是确定中间值pivot,如果中间值选取的不好,会使快速排序的效率降到O(N^2)。上面的例子采用了三选一的策略来确定中间值,即在要排序的数据中选择左端、中间和右端三个数据后比较取中间值;还有在数据量较小时,比如小于三个则直接手动排序。

 

7
4
分享到:
评论

相关推荐

    JAVA排序算法总结

    ### JAVA排序算法总结 在计算机科学领域,排序算法是数据处理和分析中极其重要的组成部分,尤其是在使用Java语言进行开发时。本文将针对常用的几种排序算法进行详细的总结与解析,包括它们的基本原理、时间复杂度、...

    java排序算法总结

    本文将对Java中的九种基本排序算法进行深入的总结和探讨,包括它们的工作原理、优缺点以及适用场景。 首先,我们来看堆排序(HeapSort)。堆排序是一种基于比较的排序算法,它利用了完全二叉树的特性,通过构建最大...

    Java排序算法总结

    【Java排序算法总结】 在计算机科学中,排序算法是用于对数据进行排列的算法,而Java作为一种广泛应用的编程语言,提供了多种实现排序的方案。以下是对几种常见的Java排序算法的详细解析: 一、冒泡排序 冒泡排序...

    java排序算法使用及场景说明

    Java 排序算法使用及场景说明 本文档主要介绍了 Java 排序算法的使用和场景说明,包括了五个实践场景的解决方案。 Scenario 1: 找出两个文件共同的 URL 在这个场景中,我们有两个文件 a 和 b,每个文件中存放了 ...

    Java排序算法实现

    Java排序算法实现 Java排序算法实现 Java排序算法实现

    Java排序算法大全

    Java排序算法大全是一份专为Java开发者准备的学习资源,涵盖了各种经典的排序算法,旨在帮助初学者和有经验的程序员深入理解排序的原理和实现。排序是计算机科学中的基础且重要的概念,它在数据处理、数据库操作、...

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

    本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...

    java排序算法插入选择冒泡

    java排序算法java排序算法插入选择冒泡java排序算法插入选择冒泡

    java排序算法效率比较

    在Java编程语言中,排序算法是数据结构与算法学习中的重要组成部分。本实验通过生成大量随机数并写入文件,然后使用四种不同的排序算法进行排序,以比较它们的效率。以下是对这四种排序算法的详细解释: 1. **冒泡...

    Java各种排序算法代码.zip

    这个名为"Java各种排序算法代码.zip"的压缩包包含了一系列实现不同排序算法的Java源代码。排序算法是计算机科学中的基本概念,用于对一组数据进行排列。下面将详细讨论这些算法及其在Java中的实现。 1. 冒泡排序...

    Java排序算法总结之堆排序

    总结,堆排序是一种高效的排序算法,尤其在没有额外内存限制的情况下。尽管它不是稳定的排序算法,但其优秀的平均性能和较低的空间复杂度使其在实际应用中有着广泛的应用。理解堆排序的原理和实现,对于提升编程能力...

    java四大排序算法总结.zip

    Java作为广泛应用的编程语言,其对排序算法的支持使得开发者能够高效地处理大量数据。本篇文章将详细探讨Java中冒泡排序、选择排序、快速排序以及插入排序这四大基本排序算法,并结合代码和动画演示来帮助理解它们的...

    算法排序java

    1. 插入排序(Java排序算法总结(一):插入排序) 插入排序是一种简单的排序算法,它通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。具体步骤包括: - 遍历数组,将第一个元素...

    常用排序算法java演示

    本文将深入探讨标题"常用排序算法java演示"中涉及的知识点,包括排序算法的原理、Java实现方式以及其在实际应用中的图形演示。 首先,让我们逐一了解几种常见的排序算法: 1. **冒泡排序(Bubble Sort)**:这是一...

    java各种排序算法总结

    排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际...

    java-排序算法总结

    在编程领域,排序算法是计算机科学中的核心概念,特别是在Java这样的高级编程语言中。排序算法是用来组织和优化数据结构的关键工具,它可以帮助我们快速查找、分析和处理大量数据。本篇将深入探讨Java中实现的几种...

    Java各种排序算法代码

    在编程领域,排序算法是计算机科学中的核心概念,尤其是在Java这样的高级编程语言中。Java提供了丰富的内置库函数,如Arrays.sort(),可以方便地对数组进行排序。然而,理解并掌握各种排序算法对于优化程序性能、...

    JAVA排序汇总 java应用中一些比较经典的排序算法

    【JAVA排序汇总】Java编程语言中,排序是数据处理中非常基础且重要的操作。本文将对几种经典的排序算法进行简要介绍和分析。 1. **插入排序**: 插入排序分为直接插入排序和折半插入排序。直接插入排序是将每个...

Global site tag (gtag.js) - Google Analytics