冒泡排序
举例说明
代码如下
package day0515;
public class demo_sort {
public static void main(String[] args) {
//冒泡排序算法
int[] numbers=new int[]{3, 9, -1, 10, 20};
int i,j;
for(i=0;i<numbers.length-1;i++)
{
for(j=0;j<numbers.length-1-i;j++) // 思考:这里为什么要减去i?
{
if(numbers[j]>numbers[j+1])
{
int temp=numbers[j];
numbers[j]=numbers[j+1];
numbers[j+1]=temp;
}
}
}
System.out.println("从小到大排序后的结果是:");
for(i=0;i<numbers.length;i++)
System.out.print(numbers[i]+" ");
}
}
冒泡排序仍然可以优化,即如果有某一次没有做任何交换,即已经是有序的了,此时可以提前退出循环。优化代码略。
选择排序
基本思路如下
代码如下
public class SortDemo {
public static void main(String[] args) {
int[] arr = new int[] {101, 34, 119, 1};
selectSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i; // 用来记录最小值的索引位置,默认值为i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 遍历 i+1~length 的值,找到其中最小值的位置
}
}
// 交换当前索引 i 和最小值索引 minIndex 两处的值
if (i != minIndex) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
// 执行完一次循环,当前索引 i 处的值为最小值,直到循环结束即可完成排序
}
}
}
注:选择算法相比冒泡算法,在时间上会更快一些:以80000条数据为参考,冒泡12秒左右,选择2秒左右。
插入排序
举例说明
代码如下:
80000条数据,插入排序大概在4秒左右。
希尔排序
举例说明
简单交换法实现代码如下:
如果分组后的排序使用交换法,那么这样效率是很低的:80000条数据花了17秒左右。
现在使用移位法即插入法来改进:
80000条数据,只需要1秒左右。
快速排序
举例说明
代码实现参考1:https://blog.youkuaiyun.com/shujuelin/article/details/82423852
代码实现参考2:https://www.cnblogs.com/captainad/p/10999697.html
快速排序在效率上比希尔排序还要快,因为它使用了递归,以空间换时间。
归并排序
代码实现参考1:https://blog.youkuaiyun.com/qq_36442947/article/details/81612870
代码实现参考2:https://www.cnblogs.com/of-fanruice/p/7678801.html
归并排序所用时间和快排差不多。
基数排序(桶排序)
举例说明:
代码如下:
代码参考:https://www.cnblogs.com/developerY/p/3172379.html
在这些排序方式中,桶排序是速度最快的,但是桶排序在数据量过大时有个严重的问题,因为桶排序是典型的使用空间换时间的排序算法,所以数据量太大(比如八千万条数据)时,大概需要4个G左右的内存空间。
堆排序
代码参考:https://blog.youkuaiyun.com/u010452388/article/details/81283998
八百万条数据大概3秒左右,还是很快的。
注:本文内容截图自 韩顺平《java数据结构与算法》