Java如何實作簡單的排序
排序是資料處理中十分常見且核心的操作,雖然說實際專案開發中很小幾率會需要我們手動實現,畢竟每種語言的類別庫中都有n多種關於排序演算法的實作。但了解這些精妙的想法對我們還是大有裨益的。本文簡單溫習下最基礎的三類演算法:選擇,冒泡,插入。
先定義個交換數組元素的函數,供排序時調用
/** * 交换数组元素 * @param arr * @param a * @param b */ public static void swap(int []arr,int a,int b){ arr[a] = arr[a]+arr[b]; arr[b] = arr[a]-arr[b]; arr[a] = arr[a]-arr[b]; }
簡單選擇排序
簡單選擇排序是最簡單直觀的一種演算法,基本思想為每趟從待排序的資料元素中選擇最小(或最大)的一個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序。
在演算法實現時,每一趟確定最小元素的時候會透過不斷地比較交換來使得首位置為當前最小,交換是個比較耗時的操作。其實我們很容易發現,在還未完全確定目前最小元素之前,這些交換都是無意義的。我們可以透過設定一個變數min,每一次比較僅儲存較小元素的陣列下標,當輪循環結束之後,那麼這個變數儲存的就是目前最小元素的下標,此時再執行交換操作即可。程式碼實作很簡單,一起來看下。
程式碼實作
/** * 简单选择排序 * * @param arr */ public static void selectSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int min = i;//每一趟循环比较时,min用于存放较小元素的数组下标,这样当前批次比较完毕最终存放的就是此趟内最小的元素的下标,避免每次遇到较小元素都要进行交换。 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { min = j; } } //进行交换,如果min发生变化,则进行交换 if (min != i) { swap(arr,min,i); } } }
簡單選擇排序經過上面優化之後,無論數組原始排列如何,比較次數是不變的;對於交換操作,在最好情況下也就是數組完全有序的時候,無需任何交換移動,在最差情況下,也就是數組倒序的時候,交換次數為n-1次。綜合下來,時間複雜度為O(n2)
冒泡排序
冒泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素「浮」到頂端,最終達到完全有序
#程式碼實作
在冒泡排序的過程中,如果某一趟執行完畢,沒有做任何一次交換操作,例如數組[5,4,1,2,3],執行了兩次冒泡,也就是兩次外循環之後,分別將5和4調整到最終位置[1,2,3,4,5]。此時,再執行第三次循環後,一次交換都沒有做,這就說明剩下的序列已經是有序的,排序操作也就可以完成了,來看下代碼
/** * 冒泡排序 * * @param arr */ public static void bubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { boolean flag = true;//设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已然完成。 for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { swap(arr,j,j+1); flag = false; } } if (flag) { break; } } }
根據上面這種冒泡實現,若原數組本身就是有序的(這是最好情況),僅需n-1次比較就可完成;若是倒序,比較次數為n-1 n-2 ... 1= n(n-1)/2,交換次數和比較次數等值。所以,其時間複雜度依然為O(n2)。綜合來看,冒泡排序效能還是稍差於上面那種選擇排序的。
直接插入排序
直接插入排序基本思想是每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。
程式碼實作
/** * 插入排序 * * @param arr */ public static void insertionSort(int[] arr) { for (int i = 1; i < arr.length; i++) { int j = i; while (j > 0 && arr[j] < arr[j - 1]) { swap(arr,j,j-1); j--; } } }
簡單插入排序在最好情況下,需要比較n-1次,無需交換元素,時間複雜度為O( n);在最壞情況下,時間複雜度依然為O(n2)。但是在數組元素隨機排列的情況下,插入排序還是要優於上面兩種排序的。
以上是Java如何實作簡單的排序的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
