Java演算法學習-----------------歸併排序演算法,java歸併排序演算法
將數組中的相鄰元素兩兩配對,用歸併演算法進行排序,構成n/2組長度為2的排好序的子數組段,然後再將其排成長度為4的子數組段,如此繼續下去直到整個數組排好序。
按照此思想,消除遞迴後的歸併排序演算法(虛擬碼)如下:
public class MergeSort {public static void mergeSort(Comparable[]a){Comparable[]b=new Comparable[a.length];int s=1;while (s<a.length){mergePass(a,b,s);//合并到數組bs+=s;mergePass(b,a,s);//合并到數組as+=s;}}private static void mergePass(Comparable[] x, Comparable[] y, int s) {//合并大小為s的相鄰數組int i=0;while (i<=x.length-2*s) {//合并大小為s的兩端相鄰字數組merge(x,y,i,i+s-1,i+s*2-1);i=i+2*s;}//剩下的元素個數小於2sif (i+s<x.length) {merge(x, y, i, i+s-1, x.length-1);}else//複製到y {for (int j = i; j < x.length; j++) {y[j] = x[j];}}}private static void merge(Comparable[] c, Comparable[] d, int l, int m, int r) {//合并c[l:m]和c[m+1,r]到d[l:r]int i=1, j=m+1,k=l;while (i<=m && j<=r) {if (c[i].compareTo(c[j])<=0){d[k++]=c[i++];}else{d[k++]=c[j++];}}if (i>m){for (int k2 = 0; k2 <=r; k2++) {d[k++] = c[k2];}}else{for (int k2 = 0; k2 <=m; k2++) {d[k++] = c[k2];}}}}
java中簡單交換排序,選擇排序與冒泡排序間有何不同
這是演算法層面的問題,和java沒有什麼關係
選擇排序和冒泡排序都是基於元素交換的,因此你的分類錯誤
冒泡排序基本思想:每次將最重的一個沉入海底
選擇排序基本思想:每次掃描最重的一個與第一個交換
並且,選擇和冒泡的時間複雜度是一樣的(都是O(N^2))
所以在實際生活中作用不大,一般的語言(比如java,c++,c)都有實現好的排序演算法
比如c語言中的qsort(採用快速排序),c++的stl裡面的sort(採用多種方式混合式排序)
java裡面的sort方法(也是混合式排序,元素少的時候用了冒泡,元算多的時候用了歸併排序)
當然演算法是要學習的,這些演算法自己都要理解,用的時候呢,就用現成的就好了,如果有特殊需求的排序,當然你可以自己實現比較子
大學java中都學過什經典演算法?學過的朋友解答下
¤ 歸併排序演算法
¤ 枚舉法
¤ 數字全排列問題
¤ 最佳化高精度減法
¤ 高精度階乘
¤ 高精度減法
¤ 高精度乘法
¤ Dijkstra最短路徑(一點到各頂點最短路徑)
¤ 八皇后問題
¤ 快速排序演算法
¤ 地圖四色問題
¤ 穿越迷宮
¤ 常用排序演算法
¤ 二分尋找法完整版
¤ 標準快速排序演算法
¤ 一躺快速排序法
¤ 快速排序演算法
¤ 插入排序演算法
¤ 選擇排序演算法
¤ 冒泡排序演算法
¤ 統計演算法
¤ 常用演算法——廣度優先搜尋
¤ 常用演算法——深度優先搜尋