[Java]各种排序算法整理(更新中。。。)
2018-03-25 21:41
351 查看
一、冒泡排序
Java源码
V1版本/** * 冒泡排序基础版本 * @param a 待排序的数组 */ public static void bubbleSortV1(int[] a){ // 边界条件判断 if(a==null || a.length<2){ return; } int j = 0; int tmp = 0; for(int i=0; i<a.length-1; i++){ for(j=a.length-1; j>i; j--){ // 一次交换将最小的值移动到最左边 if(a[j]<a[j-1]){ tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } } } }
V2版本
/** * 优化后的冒泡排序,此处可能减少冒泡的轮数 * @param a */ public static void bubbleSortV2(int[] a){ // 边界条件判断 if(a==null || a.length<2){ return; } int j = 0; int tmp = 0; boolean flag = false; // 表示是否会交换 for(int i=0; i<a.length-1; i++){ if(flag){ // 如果标志为为true,表示上次未发生交换,也就是已经是有序的了,这样的话就不需要再进行交换了 break; } flag = true; for(j=a.length-1; j>i; j--){ if(a[j]<a[j-1]){ tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } } } }
性能总结
版本 | 最坏时间复杂度 | 平均时间复杂度 | 最好时间复杂度 | 空间复杂度 | 是否稳定 | 是否为本地排序 | 是否为外地排序 |
---|---|---|---|---|---|---|---|
V1 | O(n2)O(n2) | O(n2)O(n2) | O(n2)O(n2) | O(1)O(1) | 是 | 是 | 否 |
V2 | O(n2)O(n2) | O(n2)O(n2) | O(n)O(n) | O(1)O(1) | 是 | 是 | 否 |
二、选择排序
Java源码
V1版本/** * 选择排序,本地排序,无需额外数组 * @param a */ public static void selectionSortLocal(int[] a){ if(a==null || a.length<=1){ return; } int minIndex = 0; int j = 0; int tmp = 0; for(int i=0; i<a.length-1; i++){ minIndex = i; // 一次遍历选取剩余数字的最小值的索引 for(j=i; j<a.length; j++){ if(a[j]<a[minIndex]){ minIndex = j; } } if(minIndex!=i) { // 交换最小值和第一个的位置 tmp = a[i]; a[i] = a[minIndex]; a[minIndex] = tmp; } } }
性能总结
版本 | 最坏时间复杂度 | 平均时间复杂度 | 最好时间复杂度 | 空间复杂度 | 是否稳定 | 是否为本地排序 | 是否为外地排序 |
---|---|---|---|---|---|---|---|
V1 | O(n2)O(n2) | O(n2)O(n2) | O(n2)O(n2) | O(1)O(1) | 是 | 是 | 否 |
三、插入排序
Java源码
V1版本/** * 插入排序,本地排序 * @param a */ public static void insertionSortLocal(int[] a){ if(a==null || a.length<2){ return; } int j = 0; int tmp = 0; for(int i=1; i<a.length; i++){ tmp = a[i]; if(tmp>=a[i-1]){ // 如果该值已经是排好序的数的最大值 continue; } for(j=i-1; j>=0; j--){ if(a[j]>tmp){ a[j+1] = a[j]; }else{ // 找到插入位置后即退出 break; } } a[j+1] = tmp; } }
V2版本
/** * 插入排序,外地排序 * @param a */ public static int[] insertionSortOuter(int[] a){ if(a==null || a.length==0){ return null; } int[] b = new int[a.length]; b[0] = a[0]; if(a.length==1){ return b; } int j = 0; for(int i=1; i<a.length; i++){ if(a[i]>=b[i-1]){ b[i] = a[i]; }else{ for(j=i-1; j>=0; j--){ if(b[j]>a[i]){ b[j+1] = b[j]; }else{ break; } } b[j+1] = a[i]; } } return b; }
性能总结
版本 | 最坏时间复杂度 | 平均时间复杂度 | 最好时间复杂度 | 空间复杂度 | 是否稳定 | 是否为本地排序 | 是否为外地排序 |
---|---|---|---|---|---|---|---|
V1 | O(n2)O(n2) | O(n2)O(n2) | O(n)O(n) | O(1)O(1) | 是 | 是 | 否 |
V2 | O(n2)O(n2) | O(n2)O(n2) | O(n)O(n) | O(n)O(n) | 是 | 否 | 是 |
四、希尔排序
希尔排序的时间复杂度分析好像比较复杂,博主这里也是摘自网上资料的分析。所以欢迎各位在底下讨论。。。Java源码
V1版本public void localSort(Item[] items) { // 边界条件检测 if(items==null || items.length<2){ return; } int k = items.length/2; // 初始增量为元素总数的一半 while (k>=1){ for(int i=0; i<k; i++){ for(int j=i+k; j<items.length; j+=k){ Item key = items[j]; int m = j-k; if(key.compareTo(items[m])<0){ for(; m>=i; m-=k){ if(items[m].compareTo(key)>=0){ items[m+k] = items[m]; }else{ break; } } items[m+k] = key; } } } k--; } }
V2版本
public void localSort(Item[] items) { // 边界条件检测 if(items==null || items.length<2){ return; } int k = items.length/2; // 初始增量为元素总数的一半 while (k>=1){ for(int i=0; i<k; i++){ for(int j=i+k; j<items.length; j+=k){ Item key = items[j]; int m = j-k; if(key.compareTo(items[m])<0){ for(; m>=i; m-=k){ if(items[m].compareTo(key)>=0){ items[m+k] = items[m]; }else{ break; } } items[m+k] = key; } } } k/=2; } }
V3版本
public void localSort(Item[] items) { // 边界条件检测 if(items==null || items.length<2){ return; } int n = (int)Math.floor(Math.log(items.length+1)); int k = (int)Math.pow(2, n)-1; // 初始增量为元素总数的一半 while (k>=1){ for(int i=0; i<k; i++){ for(int j=i+k; j<items.length; j+=k){ Item key = items[j]; int m = j-k; if(key.compareTo(items[m])<0){ for(; m>=i; m-=k){ if(items[m].compareTo(key)>=0){ items[m+k] = items[m]; }else{ break; } } items[m+k] = key; } } } n--; k = (int)Math.pow(2, n)-1; } }
性能分析
版本 | 最坏时间复杂度 | 平均时间复杂度 | 最好时间复杂度 | 空间复杂度 | 是否稳定 | 是否为本地排序 | 是否为外地排序 |
---|---|---|---|---|---|---|---|
V1 | −− | −− | −− | O(1)O(1) | 是 | 是 | 否 |
V2 | O(n2)O(n2) | O(n2)O(n2) | O(n2)O(n2) | O(1)O(1) | 是 | 是 | 否 |
V3 | O(n32)O(n32) | O(n32)O(n32) | O(n32)O(n32) | O(1)O(1) | 是 | 是 | 否 |
相关文章推荐
- java的各种排序算法代码整理
- java各种排序算法整理
- 各种排序算法的分析及java实现
- 各种排序算法及其java程序实现 &lt;转&gt;
- Java语言写的各种排序算法【未完】
- 各种排序算法的java实现
- JAVA 实现各种排序算法和复杂度分析1
- 各种排序算法的分析及java实现
- Java实现各种排序算法
- 各种排序算法的分析及java实现
- java实现各种排序算法
- 各种排序算法的JAVA实现
- 各种排序算法及其java程序实现
- 各种排序算法java实现
- 各种排序算法的分析及java实现
- Java基础之各种排序算法
- 各种排序算法的分析及java实现
- 各种排序算法的java实现
- 各种排序算法及其java程序实现
- 各种排序算法java实现