1、冒泡排序
冒泡排序是排序算法中最基本的一种排序方法,该方法逐次比较两个相邻数据的大小并交换位置来完成对数据排序,每次比较的结果都找出了这次比较中数据的最大项,因为是逐次比较,所以效率是O(N^2)的。
- public void bubbleSort() {
- int out,in;
- for(out=index-1; out>1; --out) {
- for(in=0; in<out; ++in) {
- if(array[in]>array[in+1]) {
- swap(in, in+1);
- }
- }
- }
- }
- public void swap(int dex1, int dex2) {
- int temp = array[dex1];
- array[dex1] = array[dex2];
- array[dex2] = temp;
- }
2、选择排序
选择排序对冒泡排序进行了优化,在每次遍历比较的过程中不进行交换,而是记录本次遍历的最小值,在遍历结束后再将最小值移到这次遍历的开始位置。这样虽然比较次数没有改变,但交换的次数大大减少,一共只需要N次交换。因为比较的次数没变,所以效率任然是O(N^2)的。
- public void selectionSort() {
- int out, in;
- for(out=0; out<index-1; ++out) {
- int temp = out;
- for(in=out+1; in<index; ++in) {
- if(array[in] < array[temp]) {
- temp = in;
- }
- }
- swap(out, temp);
- }
- }
3、插入排序
插入排序充分利用已排列好的数据,然后将未排序的数据插入到已排数据的队伍当中,这样每插入一个未排序数据已排队伍都将增加一个成员,最终达到排序的目的。
- public void insertionSort() {
- int out ,in;
- for(out=1; out<index; ++out) {
- int temp = array[out];
- in = out;
- while(in>0 && temp<array[in-1]) {
- array[in] = array[in-1];
- --in;
- }
- array[in] = temp;
- }
- }
4、归并排序
归并排序是将两个有序数组合并为一个有序数组的排序,应用在一般排序上要结合二分法递归地将数组依次归并,最终得到一个大的有序数组。归并的效率是O(NlogN)的,但要额外开辟一个数组来存放临时数据,所以占用空间要大一倍。
- public void mergeSort() {
- int[] newArray = new int[index];
- recMergeSort(newArray, 0, index-1);
- }
- private void recMergeSort(int[] data, int low, int upper) {
- if(low == upper) {
- return;
- }
- int mid = (low + upper)/2;
- recMergeSort(data, mid+1, upper);
- recMergeSort(data, low, mid);
- merge(data, low, mid+1, upper);
- }
- private void merge(int[] data, int lowStart, int highStart, int upperBound) {
- int j = 0;
- int lowBound = lowStart;
- int mid = highStart - 1;
- int num = upperBound - lowStart + 1;
- while(lowStart<=mid && highStart<=upperBound) {
- if(array[lowStart] < array[highStart]) {
- data[j++] = array[lowStart++];
- } else {
- data[j++] = array[highStart++];
- }
- }
- while(lowStart<=mid) {
- data[j++] = array[lowStart++];
- }
- while(highStart<=upperBound) {
- data[j++] = array[highStart++];
- }
- for(j=0; j<num; j++) {
- array[lowBound+j] = data[j];
- }
- }
5、希尔排序
希尔排序是一种高级排序,它是由插入排序进化来的,插入排序是将未排的数据依次与前面已排好的数据进行比较移动,这样如果一个较小的数排在靠后的位置,那么要找到这个数的正确位置就要进行较多次移动。希尔排序改进了这种方式,它将每次比较的间隔扩大,排过一次之后数据就分阶段有序了,之后逐渐缩小这个间隔再进行排序。这样做的目的就是让数据一开始可以在一个较大的范围内进行移动,待基本有序后数据的移动量就小了很多。
- public void shellSort() {
- int in, out;
- int h = 1;
- int temp;
- while(h < index/3) {
- h = h*3+1;
- }
- while(h>0) {
- for(out=h; out<index; ++out) {
- temp = array[out];
- in = out;
- while(in>h-1 && array[in-h] > temp) {
- array[in] = array[in-h];
- in -=h;
- }
- array[in] = temp;
- }
- h = (h-1)/3;
- }
- }
希尔排序中关键是对数据间隔h的选择,一个间隔序列是由Knuth提出的,即h=h*3+1,h的初始值为1,这是希尔排序中最优的间隔序列。
6、快速排序
快速排序是一种广泛使用的排序方法,效率可以达到O(NlogN),快速排序的原理是确定一个中间值pivot,将所有小于pivot的数据放在左侧,大于pivot的值放在右侧,之后再对左右两侧分别采取这种策略进行排序,直到这个过程结束。
- private int partition(int left, int right, int pivot) {
- int leftPtr = left;
- int rightPtr = right-1;
- while(true) {
- while(array[++leftPtr] < pivot) ;
- while(array[--rightPtr] > pivot);
- if(leftPtr >= rightPtr) {
- break;
- } else {
- swap(leftPtr, rightPtr);
- }
- }
- swap(leftPtr, right-1);
- return leftPtr;
- }
- private int median(int left, int right) {
- int center = (left+right)/2;
- if(array[left]>array[center]) {
- swap(left, center);
- }
- if(array[left]>array[right]) {
- swap(left, right);
- }
- if(array[center]>array[right]) {
- swap(center, right);
- }
- swap(center, right-1);
- return array[right-1];
- }
- private void manulSort(int left, int right) {
- int size = right-left+1;
- if(size <= 1) return;
- if(size == 2) {
- if(array[left]>array[right]) swap(left, right);
- } else {
- if(array[left]>array[right-1]) swap(left, right-1);
- if(array[left]>array[right]) swap(left, right);
- if(array[right-1]>array[right]) swap(right-1, right);
- }
- }
- private void recQuickSort(int left, int right) {
- int size = right-left+1;
- if(size<=3) {
- manulSort(left, right);
- } else {
- int pivot = median(left, right);
- int partition = partition(left, right, pivot);
- recQuickSort(left, partition-1);
- recQuickSort(partition+1, right);
- }
- }
- public void quickSort() {
- recQuickSort(0, index-1);
- }
快速排序的关键是确定中间值pivot,如果中间值选取的不好,会使快速排序的效率降到O(N^2)。上面的例子采用了三选一的策略来确定中间值,即在要排序的数据中选择左端、中间和右端三个数据后比较取中间值;还有在数据量较小时,比如小于三个则直接手动排序。
相关推荐
Java 排序算法使用及场景说明 本文档主要介绍了 Java 排序算法的使用和场景说明,包括了五个实践场景的解决方案。 Scenario 1: 找出两个文件共同的 URL 在这个场景中,我们有两个文件 a 和 b,每个文件中存放了 ...
Java排序算法大全是一份专为Java开发者准备的学习资源,涵盖了各种经典的排序算法,旨在帮助初学者和有经验的程序员深入理解排序的原理和实现。排序是计算机科学中的基础且重要的概念,它在数据处理、数据库操作、...
Java排序算法实现 Java排序算法实现 Java排序算法实现
java排序算法java排序算法插入选择冒泡java排序算法插入选择冒泡
在Java编程语言中,排序算法是数据结构与算法学习中的重要组成部分。本实验通过生成大量随机数并写入文件,然后使用四种不同的排序算法进行排序,以比较它们的效率。以下是对这四种排序算法的详细解释: 1. **冒泡...
【Java排序算法详细整理】 在计算机科学中,排序算法是用于对一组数据进行排列的算法。在Java中,实现各种排序算法有助于理解数据结构和算法的原理,同时也能提高编程能力。以下是对Java中常见的几种排序算法的详细...
这个"Java排序算法包"提供了对多种排序算法的支持,并且允许用户根据自己的需求自定义比较条件,使得排序功能更加灵活。 1. **排序算法基础**: - 排序是指将一组数据按照特定的顺序进行排列的过程。常见的排序...
Java排序算法涉及了多种方法,用于组织数组或集合中的元素,使其按照特定顺序排列。以下是对这些算法的详细解释: 1. **冒泡排序(Bubble Sort)** 冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一...
代码中列举了java常见的排序算法,并备有简单的注释信息,对于初级开发人员可供参考。
Java排序算法涉及了多种方法,每种都有其特定的适用场景和性能特点。本篇将深入探讨几种常见的Java排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序以及TimSort等。 1. **冒泡排序**: ...
这个名为"java排序算法-大全.rar"的压缩包文件显然包含了多种Java实现的排序算法,这对于我们理解和掌握这些算法至关重要。 首先,让我们从标签提及的两个经典排序算法开始:冒泡排序和折半排序。 1. **冒泡排序**...
本资源提供了丰富的Java排序算法的演示源码,注解详尽,有助于理解和学习。 1. **冒泡排序(Bubble Sort)** 冒泡排序是最基础的排序算法之一,通过不断地交换相邻的不正确顺序的元素来逐步完成排序。源码中应该...
Java排序算法是编程面试和笔试中常见的考察点,掌握这些算法对于提升编程能力和解决实际问题至关重要。本篇文章将深入探讨几种主要的Java排序算法及其特点。 1. **插入排序** - **直接插入排序**:将每个元素依次...
Java排序算法汇总大全 在计算机科学中,排序算法是用于对数据序列进行排列的算法,以便根据特定标准对其进行组织。本文将详细介绍Java中常见的几种排序算法,并提供它们的基本原理、性能分析以及适用场景。 1. ...
本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...
Java排序算法是编程领域中的重要知识点,特别是在处理大量数据时,高效的排序算法能显著提升程序性能。本资源包含了Java实现的常见排序算法集合,对于学习和理解这些算法有着极大的帮助。 1. 冒泡排序(Bubble Sort...
【Java排序算法集合】 在Java编程中,排序算法是数据结构和算法中不可或缺的一部分,它用于将一组数据按照特定的顺序排列。常见的排序算法包括选择排序、冒泡排序和插入排序,下面我们将逐一探讨这些算法的基本思想...