首页编程java编程java 实现全排序是什么?Java排序一共有几种

java 实现全排序是什么?Java排序一共有几种

编程之家2023-10-1381次浏览

大家好,关于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]就以升序排列了。

优点:稳定;

java 实现全排序是什么?Java排序一共有几种

缺点:慢,每次只能移动相邻两个数据。

二、选择排序

冒泡排序的改进版。

java 实现全排序是什么?Java排序一共有几种

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

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

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

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

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n- 1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

优点:移动数据的次数已知(n-1次);

缺点:比较次数多。

三、插入排序

已知一组升序排列数据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<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、 a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操作,直到d=1。

优点:快,数据移动少;

缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。

四、快速排序

快速排序是目前已知的最快的排序方法。

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据 a[x]作为基准。比较a[x]与其它数据并排序,使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的策略分别对a[1]~a[k-1]和a[k+1]~a[n]两组数据进行快速排序。

优点:极快,数据移动少;

缺点:不稳定。

五、箱排序

已知一组无序正整数数据a[1]、a[2]、……a[n],需将其按升序排列。首先定义一个数组x[m],且m>=a[1]、a[2]、……a[n],接着循环n次,每次x[a]++.

优点:快,效率达到O(1)

缺点:数据范围必须为正整数并且比较小

六、归并排序

归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。最简单的归并是直接将两个有序的子表合并成一个有序的表。

归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5)(括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5)中的2和 2是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.

Java排序一共有几种

java的排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。

1.插入排序:直接插入排序、二分法插入排序、希尔排序。

2.选择排序:简单选择排序、堆排序。

3.交换排序:冒泡排序、快速排序。

4.归并排序

5.基数排序

请给出java几种排序方法

java常见的排序分为:

1插入类排序

主要就是对于一个已经有序的序列中,插入一个新的记录。它包括:直接插入排序,折半插入排序和希尔排序

2交换类排序

这类排序的核心就是每次比较都要“交换”,在每一趟排序都会两两发生一系列的“交换”排序,但是每一趟排序都会让一个记录排序到它的最终位置上。它包括:起泡排序,快速排序

3选择类排序

每一趟排序都从一系列数据中选择一个最大或最小的记录,将它放置到第一个或最后一个为位置交换,只有在选择后才交换,比起交换类排序,减少了交换记录的时间。属于它的排序:简单选择排序,堆排序

4归并类排序

将两个或两个以上的有序序列合并成一个新的序列

5基数排序

主要基于多个关键字排序的。

下面针对上面所述的算法,讲解一些常用的java代码写的算法

二插入类排序之直接插入排序

直接插入排序,一般对于已经有序的队列排序效果好。

基本思想:每趟将一个待排序的关键字按照大小插入到已经排序好的位置上。

算法思路,从后往前先找到要插入的位置,如果小于则就交换,将元素向后移动,将要插入数据插入该位置即可。时间复杂度为O(n2),空间复杂度为O(1)

package sort.algorithm;

public class DirectInsertSort{

public static void main(String[] args){

// TODO Auto-generated method stub

int data[]={ 2, 6, 10, 3, 9, 80, 1, 16, 27, 20};

int temp, j;

for(int i= 1; i< data.length; i++){

temp= data[i];

j= i- 1;

//每次比较都是对于已经有序的

while(j>= 0&& data[j]> temp){

data[j+ 1]= data[j];

j--;

}

data[j+ 1]= temp;

}

//输出排序好的数据

for(int k= 0; k< data.length; k++){

System.out.print(data[k]+"");

}

}

}

三插入类排序之折半插入排序(二分法排序)

条件:在一个已经有序的队列中,插入一个新的元素

折半插入排序记录的比较次数与初始序列无关

思想:折半插入就是首先将队列中取最小位置low和最大位置high,然后算出中间位置mid

将中间位置mid与待插入的数据data进行比较,

如果mid大于data,则就表示插入的数据在mid的左边,high=mid-1;

如果mid小于data,则就表示插入的数据在mid的右边,low=mid+1

最后整体进行右移操作。

时间复杂度O(n2),空间复杂度O(1)

package sort.algorithm;

//折半插入排序

public class HalfInsertSort{

public static void main(String[] args){

int data[]={ 2, 6, 10, 3, 9, 80, 1, 16, 27, 20};

//存放临时要插入的元素数据

int temp;

int low, mid, high;

for(int i= 1; i< data.length; i++){

temp= data[i];

//在待插入排序的序号之前进行折半插入

low= 0;

high= i- 1;

while(low<= high){

mid=(low+ high)/ 2;

if(temp< data[mid])

high= mid- 1;

else

// low=high的时候也就是找到了要插入的位置,

//此时进入循环中,将low加1,则就是要插入的位置了

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++){

System.out.print(data[k]+"");

}

}

}

四插入类排序之希尔排序

希尔排序,也叫缩小增量排序,目的就是尽可能的减少交换次数,每一个组内最后都是有序的。

将待续按照某一种规则分为几个子序列,不断缩小规则,最后用一个直接插入排序合成

空间复杂度为O(1),时间复杂度为O(nlog2n)

算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

package sort.algorithm;

public class ShellSort{

public static void main(String[] args){

int a[]={ 1, 54, 6, 3, 78, 34, 12, 45, 56, 100};

double d1= a.length;

int temp= 0;

while(true)

{

//利用这个在将组内倍数减小

//这里依次为5,3,2,1

d1= Math.ceil(d1/ 2);

//d为增量每个分组之间索引的增量

int d=(int) d1;

//每个分组内部排序

for(int x= 0; x< d; x++)

{

//组内利用直接插入排序

for(int i= x+ d; i< a.length; i+= d){

int j= i- d;

temp= a[i];

for(; j>= 0&& temp< a[j]; j-= d){

a[j+ d]= a[j];

}

a[j+ d]= temp;

}

}

if(d== 1)

break;

}

for(int i= 0; i< a.length; i++)

System.out.print(a[i]+"");

}

}

五交换类排序之冒泡排序

交换类排序核心就是每次比较都要进行交换

冒泡排序:是一种交换排序

每一趟比较相邻的元素,较若大小不同则就会发生交换,每一趟排序都能将一个元素放到它最终的位置!每一趟就进行比较。

时间复杂度O(n2),空间复杂度O(1)

package sort.algorithm;

//冒泡排序:是一种交换排序

public class BubbleSort{

//按照递增顺序排序

public static void main(String[] args){

// TODO Auto-generated method stub

int data[]={ 2, 6, 10, 3, 9, 80, 1, 16, 27, 20, 13, 100, 37, 16};

int temp= 0;

//排序的比较趟数,每一趟都会将剩余最大数放在最后面

for(int i= 0; i< data.length- 1; i++){

//每一趟从开始进行比较,将该元素与其余的元素进行比较

for(int j= 0; j< data.length- 1; j++){

if(data[j]> data[j+ 1]){

temp= data[j];

data[j]= data[j+ 1];

data[j+ 1]= temp;

}

}

}

for(int i= 0; i< data.length; i++)

System.out.print(data[i]+"");

}

}

关于java 实现全排序是什么的内容到此结束,希望对大家有所帮助。

java什么继承?JAVA中什么是继承java初始化块是什么 Java的静态块和初始化块分别何时执行有什么区别