java的七种经典排序

合集下载

JAVA实现各种排序算法

JAVA实现各种排序算法

{ System.out.print(data[k]+" ");
} }
四 、插入类排序-----希尔排序 希尔排序,也叫缩小增量排序 将待续按照某一种规则分为几个子序列,不断缩小规则,最后用一个直接插入排序合成 空间复杂度为 O(1),时间复杂度为 O(nlog2n) 算法先将要排序的一组数按某个增量 d(n/2,n 为要排序数的个数)分成若干组,每组中记
low = mid + 1; } //找到了要插入的位置,从该位置一直到插入数据的位置之间数据向后移动 for(int j = i; j >= low + 1; j--) data[j] = data[j - 1]; //low 已经代表了要插入的位置了 data[low] = temp; } for(int k=0;k<data.length;k++)
}
五 交换类排序-----冒泡排序 交换类排序核心就是每次比较都要进行交换 冒泡排序:是一种交换排序 每次比较若大小不同则就会发生交换,每一趟排序都能将一个元素放到它最终的位置!每
一趟就进行比较。 时间复杂度 O(n2),空间复杂度 O(1)
public static void bubbleSort(int[] a){ //从头开始两两比较,若前边值大则交换 否则,继续比较; // 只需记录需要交换的值 int tmp;
20 */
21 public static void max_heapify(int[] a, int i) {
22 int left = leftChild(i);
23 int right = rightChild(i);
24 int largest = 0;

java的排序方法

java的排序方法

java的排序方法Java是一种广泛使用的编程语言,它提供了许多排序方法,可以帮助开发人员快速、高效地对数据进行排序。

在本文中,我们将介绍Java中常用的排序方法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。

1. 冒泡排序冒泡排序是一种简单的排序算法,它通过比较相邻的元素并交换它们的位置来排序。

该算法的时间复杂度为O(n^2),因此对于大型数据集来说,它并不是最优的选择。

2. 选择排序选择排序是一种简单的排序算法,它通过选择最小的元素并将其放置在正确的位置来排序。

该算法的时间复杂度为O(n^2),因此对于大型数据集来说,它也不是最优的选择。

3. 插入排序插入排序是一种简单的排序算法,它通过将元素插入到已排序的序列中来排序。

该算法的时间复杂度为O(n^2),但是对于小型数据集来说,它是一种非常有效的排序方法。

4. 快速排序快速排序是一种高效的排序算法,它通过选择一个基准元素并将数组分成两个子数组来排序。

该算法的时间复杂度为O(nlogn),因此对于大型数据集来说,它是一种非常有效的排序方法。

5. 归并排序归并排序是一种高效的排序算法,它通过将数组分成两个子数组并将它们排序,然后将它们合并成一个有序的数组来排序。

该算法的时间复杂度为O(nlogn),因此对于大型数据集来说,它也是一种非常有效的排序方法。

总结在Java中,有许多不同的排序方法可供选择。

选择正确的排序方法取决于数据集的大小和性质。

对于小型数据集来说,插入排序和选择排序是非常有效的排序方法。

对于大型数据集来说,快速排序和归并排序是更好的选择。

无论选择哪种排序方法,都应该注意算法的时间复杂度和空间复杂度,以确保程序的效率和可靠性。

Java程序员必知的8大排序

Java程序员必知的8大排序

Java程序员必知的8大排序8种排序之间的关系:1、直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。

如此反复循环,直到全部排好顺序。

(2)实例3)用java实现2、希尔排序(最小增量排序)(1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。

当增量减到1时,进行直接插入排序后,排序完成。

(2)实例:(3)用java实现3、简单选择排序(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

(2)实例:(3)用java实现4、堆排序(1)基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。

堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)时称之为堆。

在这里只讨论满足前者条件的堆。

由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。

完全二叉树可以很直观地表示堆的结构。

堆顶为根,其它为左子树、右子树。

初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个堆,这时堆的根节点的数最大。

然后将根节点与堆的最后一个节点交换。

然后对前面(n-1)个数重新调整使之成为堆。

依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。

从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。

java 排序方法

java 排序方法

java 排序方法在Java编程中,排序是一项非常常见的操作。

它可以帮助我们将一组数据按照特定的顺序进行排列,使得数据更易于查找和分析。

在Java中,有多种排序方法可以使用,每种方法都有其特点和适用场景。

接下来,我们将介绍几种常见的Java排序方法,帮助您更好地理解和使用它们。

首先,我们来介绍最常见的排序方法之一,冒泡排序。

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

通过多次的遍历和比较,最终实现整个数列的排序。

冒泡排序的时间复杂度为O(n^2),在数据量较小的情况下是一个不错的选择。

其次,我们要介绍的是插入排序。

插入排序的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。

插入排序的时间复杂度也是O(n^2),但是在实际应用中,当数据规模较小时,插入排序通常比冒泡排序更快。

另外,我们还有快速排序这一高效的排序方法。

快速排序使用分治法策略来把一个序列分为两个子序列,然后递归地对子序列进行排序。

快速排序的时间复杂度为O(nlogn),在大多数情况下都比冒泡排序和插入排序更快速。

除了上述几种排序方法外,Java中还有很多其他的排序算法,比如选择排序、归并排序、堆排序等。

每种排序方法都有其适用的场景和特点,我们需要根据实际情况选择合适的排序算法来提高程序的效率。

在实际编程中,我们可以使用Java提供的Arrays.sort()方法来进行排序操作。

这个方法底层使用了快速排序和归并排序等高效的排序算法,能够满足大部分排序需求。

另外,我们也可以实现Comparator接口来自定义排序规则,以应对一些特殊的排序需求。

总的来说,排序是Java编程中一个非常重要的部分,掌握不同的排序方法对于提高程序的效率和性能至关重要。

通过本文介绍的几种常见的排序方法,相信大家对Java中的排序有了更深入的了解,希望能够在实际编程中加以运用,提高程序的质量和效率。

java的排序方法

java的排序方法

java的排序方法java是一门强大的面向对象的语音,其包涵了多种数据结构,关于数组这种数据结构我们往往必须要对里面的数据进行排序操作。

下面就来了解一下java的排序方法。

一、冒泡排序已知一组无序数据a[1]、a[2]、a[n],必须将其按升序排列。

首先比较 a[1]与a[2]的值,假设a[1]大于a[2]则交换两者的值,否则不变。

再比较a[2]与a[3]的值,假设a[2]大于a[3]则交换两者的值,否则不变。

再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。

这样处理一轮后,a[n]的值一定是这组数据中更大的。

再对 a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中更大的。

再对a[1]~a[n-2]以相同方法处理一轮,以此类推。

共处理n-1轮后a[1]、a[2]、a[n]就以升序排列了。

二、选择排序冒泡排序的改善版。

每一趟从待排序的数据元素中选出小(或大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

选择排序是不稳定的排序方法。

三、插入排序已知一组升序排列数据a[1]、a[2]、a[n],一组无序数据b[1]、b[2]、b[m],必须将二者合并成一个升序数列。

首先比较b[1]与a[1]的值,假设b[1]大于a[1],则跳过,比较b[1]与a[2]的值,假设b[1]仍然大于a[2],则持续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来 a[x]的位置这就完成了b[1]的插入。

b[2]~b[m]用相同方法插入。

(假设无数组a,可将b[1]当作n=1的数组a)四、缩小增量排序由希尔在1959年提出,又称希尔排序(shell排序)。

已知一组无序数据a[1]、a[2]、a[n],必须将其按升序排列。

发现当n不大时,插入排序的效果很好。

首先取一增量d(d五、快速排序已知一组无序数据a[1]、a[2]、a[n],必须将其按升序排列。

java面试题经典算法

java面试题经典算法

java面试题经典算法经典算法在Java面试中经常被问及,因为它们可以展示面试者对基本数据结构和算法的理解程度。

以下是一些经典算法,我会逐个介绍它们。

1. 冒泡排序(Bubble Sort),这是一种简单的排序算法,它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

时间复杂度为O(n^2)。

2. 快速排序(Quick Sort),快速排序使用分治法策略来把一个序列分为两个子序列。

它是一种分而治之的算法,时间复杂度为O(nlogn)。

3. 二分查找(Binary Search),二分查找是一种在有序数组中查找某一特定元素的搜索算法。

时间复杂度为O(logn)。

4. 递归算法(Recursion),递归是指在函数的定义中使用函数自身的方法。

递归算法通常用于解决可以被分解为相同问题的子问题的情况。

5. 动态规划(Dynamic Programming),动态规划是一种在数学、计算机科学和经济学中使用的一种方法。

它将问题分解为相互重叠的子问题,通过解决子问题的方式来解决原始问题。

6. 深度优先搜索(Depth-First Search)和广度优先搜索(Breadth-First Search),这两种搜索算法通常用于图的遍历和搜索。

深度优先搜索使用栈来实现,而广度优先搜索则使用队列来实现。

以上是一些常见的经典算法,当然还有很多其他的算法,如贪心算法、Dijkstra算法、KMP算法等等。

在面试中,除了了解这些算法的原理和实现方式之外,还需要能够分析算法的时间复杂度、空间复杂度以及适用场景等方面的知识。

希望这些信息能够帮助你在Java面试中更好地准备算法相关的问题。

java 排序规则

java 排序规则

java 排序规则Java排序规则在Java中,排序是一项常见的操作,用于对数据进行整理和排列。

排序规则即决定了排序的方式和顺序,不同的排序规则可以根据需求选择合适的算法和方法。

下面将介绍几种常用的Java排序规则。

1. 字母排序字母排序是按照字母表的顺序对字符串进行排序。

在Java中,可以使用String类的compareTo方法来比较两个字符串的大小。

该方法返回一个int值,如果字符串相等则返回0,如果字符串在字母表中排在前面则返回负数,否则返回正数。

通过实现Comparator接口,可以自定义排序规则,实现对字符串数组的字母排序。

2. 数字排序数字排序是按照数字的大小对数据进行排序。

在Java中,可以使用Arrays类的sort方法对数组进行排序。

sort方法默认使用升序排序,即从小到大排列。

如果需要降序排序,可以使用Collections 类的reverseOrder方法。

通过实现Comparable接口,可以自定义排序规则,实现对自定义类对象的数字排序。

3. 时间排序时间排序是按照时间的先后顺序对数据进行排序。

在Java中,可以使用Date类或者Calendar类来表示时间,然后使用compareTo方法进行比较。

同样,通过实现Comparator接口,可以自定义排序规则,实现对时间的排序。

4. 自定义排序规则除了使用内置的排序方法和类,我们还可以自定义排序规则。

在Java中,可以通过实现Comparator接口来自定义排序规则。

Comparator接口有一个compare方法,可以根据自己的需求来实现比较逻辑。

比如,可以根据字符串的长度、数字的奇偶性等来排序。

5. 多字段排序有时候需要按照多个字段进行排序,比如先按照年龄排序,再按照姓名排序。

在Java中,可以使用多个Comparator对象来实现多字段排序。

可以使用Comparator的thenComparing方法来实现多字段排序,先按照第一个字段排序,如果相等再按照第二个字段排序,依次类推。

java排序算法代码

java排序算法代码

java排序算法代码java排序算法代码介绍排序是一种常用的算法,常被用于数据结构操作当中。

是把一组数据根据某种特定顺序重新排列的过程。

排序算法的实现有很多种,比如冒泡排序,快速排序,插入排序等。

今天我们就来讨论在java中的排序算法的实现。

Java中的排序算法Java提供了几种排序算法,它们都可以用于排序集合或数组。

1、冒泡排序:冒泡排序(Bubble Sort)是一种算法,它采用多次比较和交换的方法来排序。

它的特点是从头开始,将最大或最小的值交换到最后,它的基本框架如下:// 用于排序的内部循环for (int i = 0; i < n - 1; i++){// 用于交换的内部循环for (int j = 0; j < n - 1 - i; j++) : {// 执行比较和交换if (a[j] > a[j + 1]){int temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}2、快速排序:快速排序(Quick Sort)是一种分治算法,它将一个数组分成两个子数组,其中一个子数组中的元素都比另一个子数组中的元素都要小。

步骤如下:1)选择一个基准元素,通常选择第一个元素或者最后一个元素。

2)比较基准元素与其他元素的值,将小于基准元素的放在基准元素的前面,大于基准元素的放到基准元素的后面。

3)对分出来的小数组重复之前的步骤,直到所有的小数组只剩下一个元素为止。

这里提供一段java实现快速排序算法的代码:public static void quickSort(int[] arr, int low, int high) {if (arr == null || arr.length == 0)return;if (low >= high)return;// 选择基准元素int middle = low + (high - low) / 2;int pivot = arr[middle];// 将arr[i] < pivot 的放到左边,将arr[i] > pivot 的放到右边int i = low, j = high;while (i <= j){while (arr[i] < pivot)i++;while (arr[j] > pivot)j--;if (i <= j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;i++;j--;}}// 递归if (low < j)quickSort(arr, low, j);if (high > i)quickSort(arr, i, high);}3、插入排序:插入排序(Insertion Sort)是一种基本排序算法,其原理非常简单,首先从第一个元素开始,认为第一个元素已经排好序,然后选择第二个元素,把第二个元素与第一个比较,如果比第一个元素小,就交换两个元素的位置,然后再把第三个元素与前两个比较,以此类推。

java数据结构之排序

java数据结构之排序

java数据结构之排序写在前⾯的话:本篇⽂章是我⾃⼰阅读程杰⽼师的⼤话数据结构之后⾃⼰所做的总结,⽹上有很多关于排序的详细介绍,我推荐所写的⽂章,介绍的⾮常详细。

排序是我们在程序中经常要⽤到的⼀种算法,好的排序可以极⼤的提⾼我们的⼯作效率,本篇主要介绍⼏种常见的排序算法;(简单说明:下⾯的java程序是⽤来排序的,其中sum为排序数组,sum[0]不进⾏排序,只作为哨兵或者临时变量)1、冒泡排序:冒泡排序是⼀种交换排序,其的基本思想是:两两⽐较相邻记录的关键字,如果反序则交换,直到没有反序的记录为⽌。

1//冒泡排序2 最正宗的冒泡排序,i每循环⼀次,最⼩的数就像⽓泡⼀样慢慢浮到⽔⾯上2public static void BubbleSort_2(int[] num){3for(int i = 1; i < num.length; i++){4for(int j = num.length-1; j > i; j--){5if(num[j-1] > num[j]){6 Swap(num,j-1,j); //交换函数交换num[j-1]和num[j]的值7 }8 }9 }10 }2、选择排序:简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的⽐较,从n-i+1个记录中选出关键字最⼩的记录,并和第i(1≤i≤n)个记录交换之。

1//选择排序2public static void SelectSort(int[] num){3int min;4for(int i = 1; i < num.length; i++){5 min = i;6for(int j = i + 1; j <num.length; j++){7if(num[min] > num[j]){8 min = j;9 }10 }11if(i != min){12 Swap(num,i,min); //交换函数交换num[j-1]和num[j]的值13 }14 }15 }3、插⼊排序:直接插⼊排序(Straight Insertion Sort)的基本操作是将⼀个记录插⼊到已经排好序的有序表中,从⽽得到⼀个新的、记录数增1的有序表。

java各种数组排序(插入,交换,选择,归类,基数排序)

java各种数组排序(插入,交换,选择,归类,基数排序)

import java.util.Random;/***** 排序算法的分类如下:* 1.插入排序(直接插入排序、折半插入排序、希尔排序);* 2.交换排序(冒泡泡排序、快速排序);* 3.选择排序(直接选择排序、堆排序);* 4.归并排序;* 5.基数排序。

** 关于排序方法的选择:* (1)若n较小(如n≤50),可采用直接插入或直接选择排序。

* 当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。

* (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;* (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。

***/public class SortTest {/*** 初始化测试数组的方法* @return 一个初始化好的数组*/public int[] createArray() {Random random = new Random();int[] array = new int[10];for (int i = 0; i < 10; i++) {array[i] = random.nextInt(100) - random.nextInt(100);//生成两个随机数相减,保证生成的数中有负数}System.out.println("-----------原始序列-----------------");printArray(array);return array;}/*** 打印数组中的元素到控制台**/public void printArray(int[] source) {for (int i : source) {System.out.print(i + " ");}System.out.println();}/*** 交换数组中指定的两元素的位置****/private void swap(int[] source, int x, int y) {int temp = source[x];source[x] = source[y];source[y] = temp;}/*** 冒泡排序----交换排序的一种* 方法:相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其他的数进行类似操作。

数据结构与算法(12):排序

数据结构与算法(12):排序

int[] data = new int[] {10,30,20,60,40,50};
mergesort(data);
for(int i:data) {
System.out.println(i);
}
}
public static void mergesort(int[] arr){
sort(arr, 0, arr.length-1);
例例如,假设有这样一一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步⻓长 为5开始进行行行排序,我们可以通过将这列列表放在有5列列的表中来更更好地描述算法,这样他们就应该 看起来是这样:
13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10
坏的情况下,移动次数为n(n − 1)/2
冒泡排序的时间复杂度为O(n2)。冒泡排序不不需要辅助存储单元,其空间复杂度为O(1)。如果关
键字相等,则冒泡排序不不交换数据元素,他是一一种稳定的排序方方法。
时间复杂度:最好O(n);最坏O(n2);平均O(n2) 空间复杂度:O(1)
稳定性:稳定
二二、选择排序(Selection Sort)
排好序时,元素的移动次数为0。当每一一趟都需要移动数据元素时,总的移动次数为n − 1
选择排序的时间复杂度为O(n2)。选择排序不不需要辅助的存储单元,其空间复杂度为O(1)。选择
排序在排序过程中需要在不不相邻的数据元素之间进行行行交换,它是一一种不不稳定的排序方方法。
时间复杂度:O(n2) 空间复杂度:O(1)
地方方增量量和差值都是delta temp = arr[j-delta]; arr[j-delta] = arr[j]; arr[j] = temp;

常用的java的排序算法

常用的java的排序算法

常用的java的排序算法
Java是一门广泛使用的编程语言,排序算法是Java编程中常用的算法之一。

以下是常用的Java排序算法:
1. 冒泡排序:冒泡排序是一种简单的排序算法,它通过比较相邻的元素并交换它们的位置,从而将较大的元素交换到数组的末尾。

2. 选择排序:选择排序是一种简单的排序算法,它通过选择数组中最小的元素并将其放在第一位,然后重复这个过程,直到所有元素都被排序。

3. 插入排序:插入排序是一种简单的排序算法,它通过将未排序的元素插入到已排序的元素中,从而将元素插入到正确的位置。

4. 快速排序:快速排序是一种快速排序算法,它通过将数组分成较小的子数组,并将这些子数组排序,从而将数组排序。

5. 归并排序:归并排序是一种分治算法,它将数组分成两个子数组并将这些子数组排序,然后将它们合并以获得最终的排序数组。

6. 堆排序:堆排序是一种选择排序,它通过将数组中的元素转换为二叉堆(一种特殊的数据结构),然后重复删除堆中的最大元素,从而将元素排序。

以上是常用的Java排序算法。

根据实际应用场景和数据规模,可以选择合适的排序算法以提高程序的效率。

- 1 -。

java数组排序的方法

java数组排序的方法

java数组排序的方法
1.Arrays.sort()方法:该方法可以对任何类型的数组进行排序,包括基本类型和对象类型。

通过传递一个数组参数,可以在原数组上进行排序,也可以传递一个Comparator对象来指定自定义排序规则。

2. Arrays.parallelSort()方法:该方法是Java 8中新增的方法,使用了多线程来加速排序过程。

与Arrays.sort()方法类似,它也可以对任何类型的数组进行排序,且支持自定义排序规则。

3. Collections.sort()方法:该方法用于对集合类型进行排序,例如List、Set等。

它也支持自定义排序规则,通过传递一个Comparator对象来实现。

4. 冒泡排序:该算法是一种基本的排序算法,它通过比较相邻的元素并交换位置来实现排序。

虽然它不是最优的排序算法,但是在一些特定的场景下仍然有用。

5. 快速排序:该算法是一种高效的排序算法,它通过选择一个基准元素,将数组分为两个部分并递归排序来实现排序。

它的时间复杂度为O(nlogn),是一种常用的排序算法。

6. 归并排序:该算法也是一种高效的排序算法,它通过将数组分为两个部分递归排序,然后合并两个有序数组来实现排序。

它的时间复杂度也为O(nlogn),且不会像快速排序那样对于某些特定的输入会出现最坏时间复杂度。

以上是Java数组排序的几种方法,可以根据实际情况选择适合的方法来排序数组。

Java实现几种常见排序方法-直插、冒泡、选择、快排、堆排等

Java实现几种常见排序方法-直插、冒泡、选择、快排、堆排等

Java实现几种常见排序方法日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。

冒泡排序是一种简单的排序算法。

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

以下程序已经经过验证,可以运行。

代码/*** 冒泡法排序<br/>* <li>比较相邻的元素。

如果第一个比第二个大,就交换他们两个。

</li>* <li>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。

在这一点,最后的元素应该会是最大的数。

</li>* <li>针对所有的元素重复以上的步骤,除了最后一个。

</li>* <li>持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

</li>** @param numbers* 需要排序的整型数组*/public static void bubbleSort(int[] numbers) {int temp; // 记录临时中间值int size = numbers.length; // 数组大小for (int i = 0; i < size - 1; i++) {for (int j = i + 1; j < size; j++) {if (numbers[i] < numbers[j]) { // 交换两数的位置temp = numbers[i];numbers[i] = numbers[j];numbers[j] = temp;}}}}快速排序使用分治法策略来把一个序列分为两个子序列。

JAVA的七种经典排序

JAVA的七种经典排序
public static int[] selectSort1(int[] array) { for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i + 1; j < array.length; j++) {
此文中的七种排序算法为个人总结,程序均在eclipse中验证成功,可供参考
package sort; /*
* 各种排序方法总结 */ public class Sort {
public static void main(String[] args) { int[] array={4,9,6,7,2,3,1,5,8,0}; Sort.heapSort(array); for(int i=0;i<array.length;i++){ System.out.print(array[i]); }
} array[k+i] = temp; } }
return array; } /*
* 6.快速排序:分治的思想,在数组中设置一个游标,从数组的两端来遍历数组, * 将元素和游标相比,意图达到两组数据一边游标小,一边比游标大。那么此时的游标就处 于两组数组的中间。
* 然后依次对前后两组数据排序,此时当然可以利用递归了。时间平均复杂度是O(n*logn), * 排序算法貌似是公认最实用最好的排序算法,在大多数情况下都能解决问题,提高效率, * 当然也有糟糕的时候,此时的算法时间复杂度达到O(n2)。 */ //以最左边的元素为游标 public static int[] quickSort1(int[] array,int left,int right){

Java各种排序算法总结

Java各种排序算法总结

排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列。

对一个排序算法来说,一般从下面3个方面来衡量算法的优劣:1. 时间复杂度:它主要是分析关键字的比较次数和记录的移动次数。

2. 空间复杂度:分析排序算法中需要多少辅助内存。

3. 稳定性:若两个记录A和B的关键字值相等,但是排序后A,B的先后次序保持不变,则称这种排序算法是稳定的;反之,就是不稳定的。

就现有的排序算法来看,排序大致可分为内部排序和外部排序。

如果整个排序过程不需要借助外部存储器(如磁盘等),所有排序操作都是在内存中完成,这种排序就被称为内部排序。

如果参与排序的数据元素非常多,数据量非常大,计算无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘),这种排序就被称为外部排序。

外部排序最常用算噶是多路归并排序,即将原文件分解称多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序,接下来再对多个有序的子文件进行归并排序。

就常用的内部排序算法来说,可以分为以下几类:∙选择排序(直接选择排序,堆排序)∙交换排序(冒泡排序,快速排序)∙插入排序(直接插入排序,折半插入排序,Shell排序)∙归并排序∙桶式排序∙基数排序Java排序算法(二):直接选择排序直接选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,它需要经过n-1趟比较。

算法不稳定,O(1)的额外的空间,比较的时间复杂度为O(n^2),交换的时间复杂度为O(n),并不是自适应的。

在大多数情况下都不推荐使用。

只有在希望减少交换次数的情况下可以用。

基本思想n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

java中的排序算法

java中的排序算法

Java排序算法1)分类:1)插入排序(直接插入排序、希尔排序)2)交换排序(冒泡排序、快速排序)3)选择排序(直接选择排序、堆排序)4)归并排序5)分配排序(箱排序、基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序。

1)选择排序算法的时候1.数据的规模;2.数据的类型;3.数据已有的顺序一般来说,当数据规模较小时,应选择直接插入排序或冒泡排序。

任何排序算法在数据量小时基本体现不出来差距。

考虑数据的类型,比如如果全部是正整数,那么考虑使用桶排序为最优。

考虑数据已有顺序,快排是一种不稳定的排序(当然可以改进),对于大部分排好的数据,快排会浪费大量不必要的步骤。

数据量极小,而起已经基本排好序,冒泡是最佳选择。

我们说快排好,是指大量随机数据下,快排效果最理想。

而不是所有情况。

3)总结:――按平均的时间性能来分:1)时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好;2)时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为最好,特别是对那些对关键字近似有序的记录序列尤为如此;3)时间复杂度为O(n)的排序方法只有,基数排序。

当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。

简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。

――按平均的空间性能来分(指的是排序过程中所需的辅助空间大小):1)所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1);2)快速排序为O(logn ),为栈所需的辅助空间;3)归并排序所需辅助空间最多,其空间复杂度为O(n );4)链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。

Java中常见的排序方法

Java中常见的排序方法

Java中常见的排序⽅法本博主要介绍Java中⼏种常见的排序算法;/*排序⽅法的演⽰1)插⼊排序(直接插⼊排序、希尔排序)2)交换排序(冒泡排序、快速排序)3)选择排序(直接选择排序、堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序。

*/其中,⽂字部分来⾃于⽹上整理,代码部分属于⾃⼰实现的(堆排序,归并排序,基数排序代码来⾃⽹上),主要⽤于⾃⼰学习,有空的时候翻翻⽼笔记看看-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1.插⼊排序1.1.基本思想 直接插⼊排序的基本操作是将⼀个记录插⼊到已经排好的有序表中,从⽽得到⼀个新的、记录数增1的有序表。

对于给定的⼀组记录,初始时假定第⼀个记录⾃成⼀个有序序列,其余记录为⽆序序列。

接着从第⼆个记录开始,按照记录的⼤⼩依次将当前处理的记录插⼊到其之前的有序序列中,直到最后⼀个记录插到有序序列中为⽌。

1.2.复杂度分析 当最好的情况,也就是要排序的表本⾝就是有序的,此时只有数据⽐较,没有数据移动,时间复杂度为O(n)。

当最坏的情况,即待排序的表是逆序的情况,此时需要⽐较次数为:2+3+…+n=(n+2)(n-1)/2次,⽽记录移动的最⼤值也达到了(n+4)(n-1)/2次.如果排序记录是随机的,那么根据概率相同的原则,平均⽐较和移动次数约为次n2/4,因此,得出直接插⼊排序发的时间复杂度为。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

此文中的七种排序算法为个人总结,程序均在eclipse中验证成功,可供参考package sort;/** 各种排序方法总结*/public class Sort {public static void main(String[] args) {int[] array={4,9,6,7,2,3,1,5,8,0};Sort.heapSort(array);for(int i=0;i<array.length;i++){System.out.print(array[i]);}}/** 1.冒泡法排序:那么就依次相邻两个数比较大小,然后把大(小)的数放在后面,依次类推。

冒泡排序时间复杂度O(n2)*/public static int[] bubbleSort(int[] array){int temp=0;for(int i=0;i<array.length;i++){for(int j=0;j<array.length-1;j++){if(array[i]<array[j]){temp=array[i];array[i]=array[j];array[j]=temp;}}}return array;}/** 2.直接选择法排序:从当前数中选出一个最大或者最小的值排在最前面,* 然后从剩下的数中选出剩下数的最值排在已经排序的数的后面,算法时间复杂度O(n2) */public static int[] selectSort(int[] array) {for (int i = 0; i < array.length; i++) {int index = 0;for (int j = 0; j < array.length - i; j++) {if (array[j] > array[index]) {index = j;}}int temp = array[array.length - i - 1];array[array.length - i - 1] = array[index];array[index] = temp;}return array;}public static int[] selectSort1(int[] array) {for (int i = 0; i < array.length; i++) {int minIndex = i;for (int j = i + 1; j < array.length; j++) {if (array[minIndex] > array[j]) {minIndex = j;}}int temp = array[i];array[i] = array[minIndex];array[minIndex] = temp;}return array;}/** 3.反转排序:反转数组*/public static int[] reverseSort(int[] array){int temp = 0;for(int i=0;i<array.length/2;i++){temp=array[i];array[i]=array[array.length-i-1];array[array.length-i-1]=temp;}return array;}/** 4.插入排序:依次遍历数组,假设前面已经有一部分排过序的,* 当前待排数字跟前面的数字依次比较大小,将其插在对应顺序位置,算法时间复杂度O(n2)*/public static int[] insertSort(int[] array){int temp;for(int i=1;i<array.length;i++){temp=array[i];int j=i;while(--j>=0&&array[j]>temp){array[j+1]=array[j];}array[j+1]=temp;}return array;}/** 5.希尔排序:希尔排序是对插入排序的改进,可以把当前数据分组,每个分组都有一定间隔* 它们两两比较大小。

然后再减小间隔范围,或者说增多分组个数,算法时间复杂度O(n2) */public static int[] shellSort(int[] array){for(int i=array.length/2;i>0;i/=2){int temp;int k;for(int j=i;j<array.length;j++){temp = array[j];for(k=j-i;(k>=0)&&array[k]>temp;k-=i){array[k+i] = array[k];}array[k+i] = temp;}}return array;}/** 6.快速排序:分治的思想,在数组中设置一个游标,从数组的两端来遍历数组,* 将元素和游标相比,意图达到两组数据一边游标小,一边比游标大。

那么此时的游标就处于两组数组的中间。

* 然后依次对前后两组数据排序,此时当然可以利用递归了。

时间平均复杂度是O(n*logn), * 排序算法貌似是公认最实用最好的排序算法,在大多数情况下都能解决问题,提高效率, * 当然也有糟糕的时候,此时的算法时间复杂度达到O(n2)。

*///以最左边的元素为游标public static int[] quickSort1(int[] array,int left,int right){int i,j,middle,temp;middle = array[left];i = left + 1;j = right - 1;do{while( i<right && array[i]<middle){i++;}while( j>left && array[j]>middle){j--;}if(i >= j){break;}temp = array[i];array[i] = array[j];array[j] = temp;i++;j--;}while(i<=j);array[left] = array[j];array[j] = middle;if(left<j-1){quickSort1(array,left,j);}if(right>j+1){quickSort1(array,j+1,right);}return array;}//以中间元素为游标public static int[] quickSort2(int[] array, int left, int right) { int i, j, middle, temp;i = left;j = right - 1;middle = array[(i + j) / 2];do {while (i < right && array[i] < middle){i++;}while (j > left && array[j] > middle){j--;}if (i >= j){break;}temp = array[i];array[i] = array[j];array[j] = temp;i++;j--;} while (i < j);if (left < i - 1){quickSort2(array, left, i);}if (right > i + 2){quickSort2(array, i, right);}return array;}/** 7.堆排序:堆其实就一个二叉树,其中要满足父节点大于或者小于子节点。

* 把数组中元素按照堆来遍历,修正堆后,那么最大或者最小的元素就在根节点上了。

* 我们把根节点移除,按照相同的方法再次得到最值,依次类推,直到剩下一个元素位置。

* 算法时间复杂度是O(n*logn)。

*/public static int[] heapSort(int[] array) {int j, temp;for (int i = array.length; i > 0; i--) {j = i / 2 - 1;HeapAdjust(array, j, i);temp = array[0];array[0] = array[i-1];array[i-1] = temp;}return array;}public static void HeapAdjust(int array[], int i, int nLength) { int nchild;int ntemp;while (i >= 0) {nchild = 2 * i + 1;ntemp = array[i];if (array[nchild] < ntemp) {ntemp = array[nchild];array[nchild] = array[i];array[i] = ntemp;}if (nchild < nLength - 1) {nchild++;if (array[nchild] < ntemp) {ntemp = array[nchild];array[nchild] = array[i];array[i] = ntemp;}}i--;}}}。

相关文档
最新文档