java 排序算法分析
一、冒泡排序(时间复杂度O(N^2))
public int[] bubbling(int[] arr){ if(arr.length <= 1) return arr; for(int i = arr.length; i > 0; i--){ 1 for(int j = 0; j < i-1; j ++){ 2 if(arr[j] > arr[j + 1]){ int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; }
算法流程分析:
冒泡排序是先找到最大的数,放在第N 个位置, 然后再找到剩下的最大的数放在第 N-1 个位置, 重复一直找下去
上面的 “1” 是用来控制冒泡的终点的, “2” 是 用来执行冒泡动作的 ,相邻的两个元素之间进行比较,然后互换位置进行对调
算法复杂度分析:
因为先冒泡: 0 - N-1 个,其次 0 - N-2 个 依次往下, 所以算法复杂度为O(N^2)
二、选择排序(时间复杂度O(N^2))
public void choose(int[] arr){ if(arr.length <= 1) return arr; for(int i = 0; i < arr.length; i ++){ for(int j = i+ 1; j < arr.length; j ++){ if(arr[i] > arr[j]){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } return arr; }
算法流程分析:
选择排序是通过找出所有元素中最小的数, 放在 “0” 位置上, 然后找到剩下的数里面最小的数放在 “1” 位置上, 依次进行:
所以白话就是: 我先拿第一个数和其他书比较, 但是我要保证我手里面的数字是最小的(怎么保证就是不断比较), 然后把这个数字放在 “0” 位置上面
然后依次执行
算法复杂度分析:
因为先拿一个数和其他数字进行比较:比较次数 N-1 次,其次 N-2 次 依次往下, 所以算法复杂度为O(N^2)
三、插入排序法(时间复杂度O(N^2))
public void insert(int[] arr){ if(arr.length <= 1) return arr; for(int i = 1; i < arr.length; i ++){ 1 for(int j = 0; j < i; j ++){ 2 if(arr[j] > arr[j + 1]){ int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return (arr); }
算法流程分析:
插入排序:就像你打扑克, 抓到一张牌,然后再抓一张牌,比较这两张牌,排序这两张牌, 然后再抓到第三张牌, 排序这三张牌,依次如下;
其中 "1" 就是用来控制比较前几张牌的, “2” 是实现前比较前几张牌的大小的
算法复杂度分析:
因为先比较: 2 个,其次 3个 依次往下, 所以算法复杂度为O(N^2)
问题: 你的程序是不是有问题, 在比较几个数字之间的大小的顺序是不是弄反了,违背了插入排序的思想,哈哈哈
四、总结
三种基本的排序算法在时间复杂度上面基本差不多的,所以在排序的时候都可以使用
但是插入算法的时间复杂度并不稳定,最好的情况(1,2,3,4,5),不需要排序的这种,时间复杂度为 O(N),而
冒泡排序和选择排序的时间复杂度稳定为O(N^2)