算法——常见排序算法

冒泡排序 

举例说明

 

代码如下

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数据结构与算法》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值