<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
從今天開始, 小白我將帶大家開啟 Java 資料結構 & 演演算法的新篇章.
氣泡排序 (Bubble Sort) 是一種簡單的排序演演算法. 它重複地遍歷要排序的數列, 一次比較兩個元素, 如果他們的順序錯誤就把他們交換過來. 遍歷數列的工作是重複地進行直到沒有再需要交換, 也就是說該數列已經排序完成. 這個演演算法的名字由來是因為越小的元素會經由交換慢慢 「浮」 到數列的頂端.
氣泡排序流程:
程式碼實現:
import java.util.Arrays; public class bubble { public static void main(String[] args) { // 建立資料 int[] array = {426,375474,8465,453}; // 實現排序 System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(bubbleSort(array))); } public static int[] bubbleSort(int[] array) { // 如果陣列為空, 返回 if (array.length == 0){ return array; } // 執行冒泡過程n次, n為陣列長度 for (int i = 0; i < array.length; i++) { // 冒泡過程 for (int j = 0; j < array.length - 1 - i; j++) { // 判斷j索引的元素是否比j+1索引的元素大 if (array[j+1] < array[j]) { // 交換位置 int temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp; } } } return array; } }
輸出結果:
[426, 375474, 8465, 453]
[426, 453, 8465, 375474]
插入排序 (Insertion Sort) 是一種簡單直觀的排序演演算法. 它的工作原理是通過構建有序序列, 對於未排序資料, 在已排序序列中從後向前掃描,找到相應位置並插入. 插入排序在實現上, 在從後向前掃描過程中, 需要反覆把已排序元素逐步向後挪位, 為最新元素提供插入空間.
插入排序流程:
程式碼實現:
import java.util.Arrays; public class insert { public static void main(String[] args) { // 建立資料 int[] array = {426,375474,8465,453}; // 實現排序 System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(insertionSort(array))); } public static int[] insertionSort(int[] array) { // 如果陣列為空, 返回 if (array.length == 0) return array; // 待排序元素 int current; // 執行插入過程n-1次 for (int i = 0; i < array.length - 1; i++) { // 指定待排序元素 current = array[i + 1]; int preIndex = i; // 執行插入過程, 往前一個個比對 while (preIndex >= 0 && current < array[preIndex]) { array[preIndex + 1] = array[preIndex]; preIndex--; } // 插入元素 array[preIndex + 1] = current; } return array; } }
輸出結果:
[426, 375474, 8465, 453]
[426, 453, 8465, 375474]
歸併排序 (Merge Sort) 是一種建立在歸併操作上的演演算法, 是分治的一個經典應用.
歸併排序流程:
程式碼實現:
import java.util.Arrays; public class merge { public static void main(String[] args) { // 建立資料 int[] array = {426,375474,8465,453}; // 實現排序 System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(mergeSort(array))); } public static int[] mergeSort(int[] array) { // 如果陣列長度小於2, 返回 if (array.length < 2) { return array; } // 分治 int mid = array.length / 2; int[] left = Arrays.copyOfRange(array, 0, mid); int[] right = Arrays.copyOfRange(array, mid, array.length); return merge(mergeSort(left), mergeSort(right)); } public static int[] merge(int[] left, int[] right) { // 建立陣列用於存放合併後的序列 int[] result = new int[left.length + right.length]; for (int index = 0, i = 0, j = 0; index < result.length; index++) { // 左序列取完 if (i >= left.length) result[index] = right[j++]; // 右序列取完 else if (j >= right.length) result[index] = left[i++]; // 左序列的第i個大於有序列的第j個 else if (left[i] > right[j]) result[index] = right[j++]; else result[index] = left[i++]; } return result; } }
輸出結果:
[426, 375474, 8465, 453]
[426, 453, 8465, 375474]
快速排序 (Quicksort) 通過一趟排序將要排序的資料分割成獨立的兩部分, 其中一部分的所有資料都比另外一部分的所有資料都要小, 然後再按此方法對這兩部分資料分別進行快速排序, 整個排序過程可以遞迴進行, 以此達到整個資料變成有序序列.
快速排序流程:
程式碼實現:
import java.util.Arrays; public class quick { public static void main(String[] args) { // 建立資料 int[] array = {426, 375474, 8465, 453}; // 實現排序 System.out.println(Arrays.toString(array)); quickSort(array, 0, array.length - 1); System.out.println(Arrays.toString(array)); } public static void quickSort(int[] arr, int low, int high) { // 定義 int p, i, j, temp; if (low >= high) { return; } // p就是基準數, 每個陣列的第一個 p = arr[low]; i = low; j = high; while (i < j) { //右邊當發現小於p的值時停止迴圈 while (arr[j] >= p && i < j) { j--; } //這裡一定是右邊開始,上下這兩個迴圈不能調換(下面有解析,可以先想想) //左邊當發現大於p的值時停止迴圈 while (arr[i] <= p && i < j) { i++; } temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } // 交換p和arr[i] arr[low] = arr[i]; arr[i] = p; // 分別進行快排 quickSort(arr, low, j - 1); quickSort(arr, j + 1, high); } }
輸出結果:
[426, 375474, 8465, 453]
[426, 453, 8465, 375474]
演演算法 | 時間複雜度 | 穩定性 | 適用場景 |
---|---|---|---|
氣泡排序 | O ( n 2 ) O(n^2) O(n2) | 穩定 | 陣列大致為從小到大 |
插入排序 | O ( n 2 ) O(n^2) O(n2) | 穩定 | 適用於陣列較小的場景 |
歸併排序 | O ( n l o g n ) O(nlogn) O(nlogn) | 穩定 | 適用於陣列較大的場景 |
快速排序 | O ( n l o g n ) O(nlogn) O(nlogn) | 不穩定 | 適用於陣列較大的場景 |
到此這篇關於Java 資料結構與演算法系列精講之排序演演算法的文章就介紹到這了,更多相關Java 排序演演算法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45