Java几种简单的排序源代码

Python021

Java几种简单的排序源代码,第1张

给你介绍4种排序方法及源码,供参考

1.冒泡排序

主要思路: 从前往后依次交换两个相邻的元素,大的交换到后面,这样每次大的数据就到后面,每一次遍历,最大的数据到达最后面,时间复杂度是O(n^2)。

public static void bubbleSort(int[] arr){

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

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

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

arr[j] = arr[j]^arr[j+1]

arr[j+1] = arr[j]^arr[j+1]

arr[j] = arr[j]^arr[j+1]

}

}

}

}

2.选择排序

主要思路:每次遍历序列,从中选取最小的元素放到最前面,n次选择后,前面就都是最小元素的排列了,时间复杂度是O(n^2)。

public static void selectSort(int[] arr){

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

for(int j = i+1 j < arr.length j++){

if(arr[j] < arr[i]){

arr[j] = arr[j]^arr[i]

arr[i] = arr[j]^arr[i]

arr[j] = arr[j]^arr[i]

}

}

}

}

3.插入排序

主要思路:使用了两层嵌套循环,逐个处理待排序的记录。每个记录与前面已经排好序的记录序列进行比较,并将其插入到合适的位置,时间复杂度是O(n^2)。

public static void insertionSort(int[] arr){

int j

for(int p = 1 p < arr.length p++){

int temp = arr[p]   //保存要插入的数据

//将无序中的数和前面有序的数据相比,将比它大的数,向后移动

for(j=p j>0 && temp <arr[j-1] j--){

arr[j] = arr[j-1]

}

//正确的位置设置成保存的数据

arr[j] = temp

}

}

4.希尔排序

主要思路:用步长分组,每个分组进行插入排序,再慢慢减小步长,当步长为1的时候完成一次插入排序,  希尔排序的时间复杂度是:O(nlogn)~O(n2),平均时间复杂度大致是O(n^1.5)

public static void shellSort(int[] arr){

int j 

for(int gap = arr.length/2 gap > 0  gap/=2){

for(int i = gap i < arr.length i++){

int temp = arr[i]

for(j = i j>=gap && temp<arr[j-gap] j-=gap){

arr[j] = arr[j-gap]

}

arr[j] = temp

}

}

}

本节内容是排序算法系列之一: 希尔排序 ,主要讲解了希尔排序的主体思路,选取了一个待排序的数字列表对希尔排序算法进行了演示,给出了希尔排序算法的 Java 代码实现,帮助大家可以更好的理解希尔排序算法。

希尔排序(Shell Sort),是计算机科学与技术领域中较为简单的一种排序算法。

希尔排序是插入排序的一种,有时候也被称为 “缩小增量排序”。它是插入排序的改进版,与插入排序的不同之处在于,希尔排序会优先比较距离较远的元素。希尔排序是按照其设计者希尔(Donald Shell)的名字命名而来,并于 1959 年公布出来。

在介绍完希尔排序之后,我们一起来看一下希尔排序的实现步骤具体是什么样的吧。这里我们假设待排序的序列为 [9,2,11,7,12,5],我们按照从小到大的序列进行排序。

选择一个增量序列 k1,k2, … km,其中 k1>k2>…km=1,即增量序列大小依次减小,并且最后一个增量序列大小为 1。

按照增量序列的个数 m,对整个待排序序列进行 m 趟排序。

每一趟排序,根据对应的增量 ki,需要将待排序的序列分成对应长度的子序列,分别在子序列上面进行直接插入排序。当且仅当增量序列为 1 时,整个序列作为一个整体处理。

其实,上面的 步骤 1 步骤 2 都是在排序之前进行的处理,选择对应的增量。上面的 步骤 3 每执行一次,就相当于是进行了一次插入排序,只是每次都会选择一个增量,将整个待排序序列按照增量进行划分,然后在对应增量上面进行插入排序。接下来,让我们用上面的待排序数字队列 [9,2,11,7,12,5] 进行整个算法步骤的排序演示工作。

按照 2.1 节的排序步骤,我们需要先选择对应的希尔排序中的增量值,按照一般性的原则,我们可以将增量按照待排序的序列长度依次整除 2,直到增量为 1 停止,得到对应的增量。如下:

接着,我们调用 2.1 中的 步骤 2, 步骤 3 ,按照增量值的取法,依次进行对应序列的插入排序,首先我们取增量值为 3,对应排序示例如下:

在完成增量为 3 的插入排序之后,我们接着进行增量为 1 的插入排序,这个步骤其实跟我们之前的插入排序步骤完全一致。整个过程如下:

从上面的示例可以看出,其实整个希尔排序的过程,就是根据增量大小依次进行插入排序,本质上还是针对插入排序的一种优化。

在说明希尔排序的整个过程之后,接下来,我们看看如何用 Java 代码实现希尔排序算法。

运行结果如下:

代码中的第 8 行初始化一个需要排序的数组,后面按照从小到大的排序规则,实现了数组的排序。第 12 行至 30 行是整个希尔排序的流程。第 14 行代码表示希尔排序中的增量每次整除 2 取得,第 17 行至 25 行是一个 for 循环结构,表明按照增量进行插入排序。最后第 32 行代码输出排序好的数组。

本节主要学习了希尔排序算法,通过本节课程的学习,需要熟悉希尔排序的算法流程,知道希尔排序算法的实现思路,可以自己用代码实现希尔排序算法。至此,我们已经学习了排序算法中的冒泡排序、插入排序、选择排序、希尔排序。

你的程序无限循环的主要原因是for(int j=0j<hj=j++)中的j=j++语句造成的,在java中j++是先赋值后自加,j永远也不会自增,

其它也有不对的地方,我都帮你改正了,完整的程序如下(改动的地方见注释)

import java.util.Arrays

public class test3 {

public static void main(String[] args) {

int[] arr = {2,9,41,5,7,2,6}

sort(arr)

System.out.println(Arrays.toString(arr))

}

public static int[] sort(int[] arr){

int h = arr.length//这里把h=1改成h=arr.length

//这里去掉下面的while循环

//while(h <arr.length/2){

// h = h * 2 + 1

//}

while(h >1){ //这里把h>=1改成h>1

h = (int)(h / 2)//这里对h取整数并且移到这里

for(int j = 0j <hj++) { //这里把j = j++改成j++

  for (int i = j + hi <arr.lengthi = i + h) {

   for(int z = i -hz >= 0z--) { //这里把z=i -1改成z=i-h

    if (arr[z] >arr[i]) {

     int temp

     temp = arr[z]

     arr[z] = arr[i]

     arr[i] = temp

    }

   }

  }

}

}

return arr

}

}