八大排序算法的java实现
生活随笔
收集整理的這篇文章主要介紹了
八大排序算法的java实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
八大排序算法的java實現
有時間再貼算法分析圖
JDK7的Collections.sort()的算法是TimSort, 適應性的歸并排序, 比較晦澀難懂, 這里沒有實現
public class mySort {// 冒泡排序public static void myBubbleSort(int[] array) {int lastExchange = array.length - 1; //記錄最后交換位置, 避免重復比較for (int i = lastExchange - 1; i >= 0; --i) {for (int j = 0; j <= i; ++j) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;lastExchange = j; //特性:最后交互位置后的元素已經有序 }}}}// 插入排序public static void myInsertSort(int[] array) {for (int i = 1; i <= array.length - 1; ++i) {int temp = array[i];int j = 0; // 給值移位并尋找插入點for (j = i - 1; j >= 0 && array[j] > temp; --j) {array[j + 1] = array[j];}array[j + 1] = temp;}}// 選擇排序public static void mySelectSort(int[] array) {for (int i = 0; i < array.length - 1; ++i) {int minIndex = i;// 每次選出一極值for (int j = i + 1; j <= array.length - 1; ++j) {if (array[j] < array[minIndex]) {minIndex = j;}}// 極值歸位if (minIndex != i) {int temp = array[minIndex];array[minIndex] = array[i];array[i] = temp;}}}// 希爾排序public static void myShellSort(int[] array) {int gap = 5;while (gap != 0) {//不必刻意分組, 組1->組2->組1->組2...輪流處理for (int j = gap; j <= array.length - 1; ++j) {int temp = array[j];int k = 0;for (k = j - gap; k >= 0 && array[k] > temp; k -= gap) {array[k + gap] = array[k];}array[k + gap] = temp;}gap /= 2; //重新分組 }}// 快速排序public static void myQuickSort(int[] array) {myQuickSortCore(array, 0, array.length - 1);}private static void myQuickSortCore(int[] array, int left, int right) {if (left >= right) { //遞歸出口return;}int mLeft = left;int mRight = right;int base = array[mLeft]; //第一個元素作為基準, left空位可占while(mLeft != mRight) {while (mRight > mLeft && array[mRight] >= base) {--mRight;}array[mLeft] = array[mRight]; //right可覆蓋while (mRight > mLeft && array[mLeft] <= base) {++mLeft;}array[mRight] = array[mLeft];}array[mRight] = base; //基準元素歸位, l=r myQuickSortCore(array, left, mLeft - 1); //遞歸基準以左myQuickSortCore(array, mRight + 1 , right); //遞歸基準以右 }// 歸并排序public static void myMergeSort(int[] array) {// 每個分組中有兩個來自上層迭代的有序組, gap為有序組長度, 2 * gap為分組長度for (int gap = 1; gap < array.length; gap *= 2) {int i = 0; // array下標// 分組并內部排序while (i + 2 * gap - 1 < array.length) {mergePiece(array, i, i + gap - 1, i + 2 * gap - 1);i += 2 * gap;}// 分組剩余部分排序, 只有超過一個gap才有內部排序的意義if (i + gap - 1 < array.length) {mergePiece(array, i, i + gap - 1, array.length - 1);}}}// 將array中有序的兩段piecewise1 和 piecewise2 合并成整體有序public static void mergePiece(int[] array, int head, int mid, int tail) {int i = head; // piecewise1下標 [head, mid]int j = mid + 1; // piecewise2下標 [mid + 1, tail]// 臨時數組, 保存結果int[] arrayTemp = new int[tail - head + 1]; // combineint k = 0; // combine下標while (i <= mid && j <= tail) {if (array[i] <= array[j]) {arrayTemp[k] = array[i];++i;++k;} else {arrayTemp[k] = array[j];++j;++k;}}// 復制多余部分 piecewise1while (i <= mid) {arrayTemp[k] = array[i];++i;++k;}// 復制多余部分 piecewise2while (j <= tail) {arrayTemp[k] = array[j];++j;++k;}// 結果復制到原始數組k = 0;i = head; // 重置下標, i piecewise1 + piecewise2while (i <= tail) {array[i] = arrayTemp[k];++i;++k;}}// 堆排序public static void myHeapSort(int[] array) {// 調整堆->大頂堆for (int i = array.length / 2 - 1; i >= 0; --i) { // 從最后非葉子節點開始 adjustHeap(array, i, array.length);}// 調整堆->交換堆頂/末位元素for (int j = array.length - 1; j > 0; --j) {int temp = array[0];array[0] = array[j];array[j] = temp;adjustHeap(array, 0, j); // 只需調整堆頂父節點 }}// 調整為大頂堆分布, node為父節點下標, adjustLen為涉及調整的長度(為排序使用)private static void adjustHeap(int[] array, int node, int adjustLen) {int temp = array[node]; // 拿出node形成可占空位for (int i = node * 2 + 1; i < adjustLen; i = node * 2 + 1) {if (i + 1 < adjustLen && array[i] < array[i + 1]) {++i; // 得到最大子節點 }if (array[i] > temp) {array[node] = array[i];node = i; // 為下一層迭代更新父節點node, 最后為葉子} else {break;}}array[node] = temp;}// 基數排序public static void myRadixSort(int[] array) {int d = maxBit(array);int dec = 1; //進制迭代final int R = 10; //桶個數int[] tempArray = new int[array.length]; //臨時數組, 代替桶存儲數組, 代價是需記錄下標/數量來分割桶int[] bucketCapacity = new int[R]; //桶計數 for (int i = 1; i <= d; ++i) {for (int j = 0; j < R; ++j) {bucketCapacity[j] = 0; //清空桶容量 }//計數1for (int j = 0; j < array.length; ++j) {int k = array[j] / dec % R; ++bucketCapacity[k];}//計數2 變累計, 為分割for (int j = 1; j < R; ++j) {bucketCapacity[j] = bucketCapacity[j - 1] + bucketCapacity[j];}// 存儲進桶for (int j = array.length - 1; j >= 0; --j) {int k = array[j] / dec % R; tempArray[bucketCapacity[k] - 1] = array[j];--bucketCapacity[k]; }// 寫出for(int j = 0; j < array.length; ++j) {array[j] = tempArray[j];}// 下一位dec *= 10;}}//求數組元素的最大位數private static int maxBit(int[] array) {int bit = 1;int dec = 10;for (int i = 0; i < array.length; ++i) {while (array[i] >= dec) {++bit;dec *= 10;}}return bit;} }?
posted on 2017-04-09 16:57 myJavaEE 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/myJavaEE/p/6685445.html
總結
以上是生活随笔為你收集整理的八大排序算法的java实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日利率万5是多少
- 下一篇: 使用Node.js+Socket.IO搭