Java中的排序

Java中的排序

排序方法的選擇

1.若n較小(如n≤50),可采用直接插入或直接選擇排序。當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少于直接插入,應選直接選擇排序為宜。

2.若文件初始狀態基本有序(指正序),則應選用直接插入、冒泡或隨機的快速排序為宜;

3.若n較大,則應采用時間復雜度為O(nlgn)的排序方法:快速排序、堆排序或歸并排序。

衡量排序算法的優劣:

1.時間復雜度:分析關鍵字的比較次數和記錄的移動次數

2.空間復雜度:分析排序算法中需要多少輔助內存

3.穩定性:若兩個記錄A和B的關鍵字值相等,但排序后A、B的先后次序保持不變,則稱這種排序算法是穩定的。

排序算法分類:內部排序和外部排序。

1.內部排序:整個排序過程不需要借助于外部存儲器(如磁盤等),所有排序操作都在內存中完成。

2.外部排序:參與排序的數據非常多,數據量非常大,計算機無法把整個排序過程放在內存中完成,必須借助于外部存儲器(如磁盤)。外部排序最常見的是多路歸并排序。可以認為外部排序是由多次內部排序組成。

常用的內部排序

選擇排序

基本原理:將待排序的元素分為已排序(初始為空)和未排序兩組,依次將未排序的元素中值最小的元素放入已排序的組中。直接選擇排序簡單直觀,但性能略差;堆排序是一種較為高效的選擇排序方法,但實現起來略微復雜。

基本過程:1.在一組元素R[i]到R[n]中選擇具有最小關鍵字的元素。2.若它與這組元素中的第一個元素,則將它與這組元素中的第一個元素對調。3.去除具有最小關鍵字的元素,在剩下的元素中重復1、2步,直到剩余元素只有一個為止。

算法的時間效率:無論初始狀態如何,在第i趟排序中選擇最小關鍵碼的元素,需做n-i次比較,因此總的比較次數為:n(n-1)/2 = O(n^2)

算法的空間效率:空間效率很高,只需要一個附加程序單元用于交換,其空間效率為:O(1)

算法的穩定性:不穩定

public class SelectSort {public static void selectSort(DataWrap[] data) {System.out.println("開始排序");int arrayLength = data.length;for (int i = 0; i < arrayLength - 1; i++) {for (int j = i + 1; j < arrayLength; j++) {if (data[i].compareTo(data[j]) > 0) {DataWrap temp = data[i];data[i] = data[j];data[j] = temp;}}System.out.println(java.util.Arrays.toString(data));}}public static void main(String[] args) {DataWrap[] data = { new DataWrap(9, ""), new DataWrap(-16, ""),new DataWrap(21, "*"), new DataWrap(23, ""),new DataWrap(-30, ""), new DataWrap(-49, ""),new DataWrap(21, ""), new DataWrap(30, "*"),new DataWrap(30, "") };System.out.println("排序之前:\n" + java.util.Arrays.toString(data));selectSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}
堆排序

算法的時間效率:假設有n個數據,需要進行n-1次建堆,每次建堆本身耗時 logn,則其時間效率為O(nlogn)

算法的空間效率:空間效率很高,只需要一個附加程序單元用于交換,其空間效率為O(1)

算法的穩定性:不穩定

public class HeapSort {public static void heapSort(DataWrap[] data) {System.out.println("開始排序");int arrayLength = data.length;// 循環建堆for (int i = 0; i < arrayLength - 1; i++) {// 建堆builMaxdHeap(data, arrayLength - 1 - i);// 交換堆頂和最后一個元素swap(data, 0, arrayLength - 1 - i);System.out.println(java.util.Arrays.toString(data));}}// 對data數組從0到lastIndex建大頂堆private static void builMaxdHeap(DataWrap[] data, int lastIndex) {// 從lastIndex處節點(最后一個節點)的父節點開始for (int i = (lastIndex - 1) / 2; i >= 0; i--) {// k保存當前正在判斷的節點int k = i;// 如果當前k節點的子節點存在while (k * 2 + 1 <= lastIndex) {// k節點的左子節點的索引int biggerIndex = 2 * k + 1;// 如果biggerIndex小于lastIndex,即biggerIndex +1// 代表k節點的右子節點存在if (biggerIndex < lastIndex) {// 如果右子節點的值較大if (data[biggerIndex].compareTo(data[biggerIndex + 1]) < 0) {// biggerIndex總是記錄較大子節點的索引biggerIndex++;}}// 如果k節點的值小于其較大子節點的值if (data[k].compareTo(data[biggerIndex]) < 0) {// 交換它們swap(data, k, biggerIndex);// 將biggerIndex賦給k,開始while循環的下一次循環// 重新保證k節點的值大于其左、右節點的值k = biggerIndex;} else {break;}}}}// 交換data數組中i、j兩個索引處的元素private static void swap(DataWrap[] data, int i, int j) {DataWrap temp = data[i];data[i] = data[j];data[j] = temp;}public static void main(String[] args) {DataWrap[] data = { new DataWrap(9, ""), new DataWrap(-16, ""),new DataWrap(21, "*"), new DataWrap(23, ""),new DataWrap(-30, ""), new DataWrap(-49, ""),new DataWrap(21, ""), new DataWrap(30, "*"),new DataWrap(30, "")};System.out.println("排序之前:\n" + java.util.Arrays.toString(data));heapSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}
冒泡排序

相鄰兩元素進行比較,如有需要則進行交換,每完成一次循環就將最大元素排在最后(如從小到大排序),下一次循環是將其它的數進行類似操作。

算法的時間效率:從冒泡排序的算法可以看出,若待排序的元素為正序,則只需進行一趟排序,比較次數為n-1次,移動元素次數為0;若待排序的元素為逆序,則需要進行n-1趟排序,比較次數為(n^2-n)/2 ,移動次數為3(n^2-n)/2,因此時間復雜度為O(n^2)

算法的空間效率:空間效率很高,只需要一個附加程序單元用于交換,其空間效率為O(1)

算法的穩定性:穩定

public class BubbleSort {public static void bubbleSort(DataWrap[] data) {System.out.println("開始排序");int arrayLength = data.length;for (int i = 0; i < arrayLength - 1; i++) {boolean flag = false;for (int j = 0; j < arrayLength - 1 - i; j++) {if (data[j].compareTo(data[j + 1]) > 0) {DataWrap temp = data[j + 1];data[j + 1] = data[j];data[j] = temp;flag = true;}}System.out.println(java.util.Arrays.toString(data));if (!flag)break;}}public static void main(String[] args) {DataWrap[] data = { new DataWrap(9, ""), new DataWrap(-16, ""),new DataWrap(21, "*"), new DataWrap(23, ""),new DataWrap(-30, ""), new DataWrap(-49, ""),new DataWrap(21, ""), new DataWrap(30, "*"),new DataWrap(30, "")};System.out.println("排序之前:\n" + java.util.Arrays.toString(data));bubbleSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}
快速排序

算法的時間效率:時間效率很好,因為每趟能確定的元素都呈指數增長,故時間復雜度為log(n+1)

算法的空間效率:由于使用遞歸,而遞歸使用棧,因此空間效率最優時為log(n)

算法的穩定性:由于包含跳躍式交換,因此不穩定

public class QuickSort {private static void swap(DataWrap[] data, int i, int j) {DataWrap temp = data[i];data[i] = data[j];data[j] = temp;}private static void subSort(DataWrap[] data, int start, int end) {if (start < end) {DataWrap base = data[start];int i = start;int j = end + 1;while (true) {while (i < end && data[++i].compareTo(base) <= 0);while (j > start && data[--j].compareTo(base) >= 0);if (i < j) {swap(data, i, j);} else {break;}}swap(data, start, j);subSort(data, start, j - 1);subSort(data, j + 1, end);}}public static void quickSort(DataWrap[] data){subSort(data,0,data.length-1);}public static void main(String[] args) {DataWrap[] data = { new DataWrap(9, ""), new DataWrap(-16, ""),new DataWrap(21, "*"), new DataWrap(23, ""),new DataWrap(-30, ""), new DataWrap(-49, ""),new DataWrap(21, ""), new DataWrap(30, "*"),new DataWrap(30, "") };System.out.println("排序之前:\n" + java.util.Arrays.toString(data));quickSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250545.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Codeforces Round #493 (Div. 2) C. Convert to Ones 亂搞_構造_好題

題意&#xff1a; 給你一個長度為 nnn 的 010101串 &#xff0c;你有兩種操作&#xff1a; 1.將一個子串翻轉&#xff0c;花費 XXX 2.將一個子串中的0變成1&#xff0c;1變成0&#xff0c;花費 YYY 求你將這個01串變成全是1的串的最少花費。 首先&#xff0c;我們可以將串按照0…

[T-ARA][??? ??][看著那個女人的話]

歌詞來源&#xff1a;http://music.163.com/#/song?id29343995 作曲 : ?? [作曲 : Ko-nan] 作詞 : ??/?? [作詞 : Ko-nan-/lo-Ko] baby i hate you [baby i hate you] but i love you [but i love you] cant live without you [cant live without you] baby i hate you …

node --- 連接mysql(docker環境) Sequelize庫

mysql 數據庫 [1] 首先配置 docker 環境 采用 docker-compose 方法 源碼: /test-mysql/docker-compose.yml version: 3.1 services:mysql:image: mysqlcommand: --default-authentication-pluginmysql_native_passwordrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: examp…

Java-接口練習

Java-接口練習 編寫2個接口&#xff1a;InterfaceA和InterfaceB&#xff1b;在接口InterfaceA中有個方法voidprintCapitalLetter()&#xff1b;在接口InterfaceB中有個方法void printLowercaseLetter()&#xff1b;然 后寫一個類Print實現接口InterfaceA和InterfaceB&#xff0…

類模板與運算符重載(一個簡單的例子)

類模板與運算符重載&#xff08;一個簡單的例子&#xff09; 標簽&#xff08;空格分隔&#xff09;&#xff1a; C 算法競賽 下面是一段簡單的代碼&#xff0c;表示我們建立了一個類模板Vector&#xff0c;可以看做是對STL中vector的簡單實現。 為了讓這個Vector支持通過下標…

Java 試題一

Java 試題一 1、GC是什么? 為什么要有GC 答&#xff1a;GC是垃圾收集的意思&#xff08;Gabage Collection&#xff09;,內存處理是編程人員容易出現問題的地方&#xff0c; 忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰&#xff0c;Java提供的GC功能可以自動 …

操作系統 --- [筆記]功能、組成

操作系統的作用 管理計算機硬件充當計算機用戶和計算機硬件的中介(操作系統控制硬件,協調各個用戶應用程序的硬件) 計算機系統的資源 CPU時間、內存空間、文件存儲空間、I/O設備等 操作系統的定義 如何定義一個操作系統: 計算機系統的根本目的是,執行用戶程序并且更容易解…

Java 試題二

Java 試題二 1、哪個選項和show函數重載 class Demo{ void show(int a,int b,float c){} } A.void show(int a,float c,int b){}//yes B,void show(int a,int b,float c){}//一模一樣。不可以出現在同一個類中。 C.int show(int a,float c,int b){return a;}//yes。 D.in…

Python之簡單驗證碼實現

def v_code(): ret for i in range(5): num random.randint(0,9) alf chr(random.randint(65,122)) s str(random.choice([num,alf])) ret s return retprint(v_code())轉載于:https://www.cnblogs.com/geeker-xjl/p/8809915.html

測繪軟件使用體會

進入石家莊鐵道大學已經兩年了&#xff0c;學習測繪工程專業也已經兩年了&#xff0c;大一的時候大多是對測繪不了解&#xff0c;到了大二的時候上半學期我就開始了解和使用一些測繪專業相關的軟件&#xff0c;在大二下半學期實習的時候更是深入的學習和使用測繪軟件&#xff0…

javascript --- event loop

栗子1 求下面函數的輸出 console.log(script start);setTimeout(() > {console.log(setTimeoout); }, 0);Promise.resolve().then(function(){console.log(promise1); }).then(function(){console.log(promise2); }) console.log(script end);說明: 在"promise2"…

sublime 設置自動換行

1.打開sublime,點擊preferences -> settings 2.將word_wrap的值由auto修改為true&#xff08;若沒有word_wrap&#xff0c;手動添加&#xff09; 轉載于:https://www.cnblogs.com/hitwgs/p/8821316.html

Java 試題三

Java 試題三 1、java類是否可以多繼承&#xff0c;怎么實現多繼承&#xff1f; 答&#xff1a;java沒有多繼承&#xff0c;但可以通過接口的形式來達到多繼承的目地。 2、我比較兩個String總是false&#xff0c;但是它們明明都是”abc” &#xff01; 答&#xff1a;比較Str…

Cent os常見操作命令

1.查看防火墻狀態&#xff1a;firewall-cmd –-state 2.關閉防火墻&#xff1a;systemctl stop firewalld.service 3.禁止防火墻開機啟動&#xff1a;systemctl disable firewalld.service 4.關閉selinux&#xff1a;vi /etc/selinux/config&#xff0c;然SELINUXdisabled 5.查…

koa --- 使用中間件多層級拋出錯誤

說明 能夠熟練的掌握錯誤的拋出,可以在一定程度上提高代碼的開發效率和可讀性 構造錯誤 本栗采用調用一個不存在的函數來拋出錯誤 const Koa require(koa); const app new Koa();// 響應時間輸出中間件 app.use(async (ctx, next) > {await next();// 獲取響應頭,印證…

電腦的真正價值

1.不是應用程序&#xff0c;而是開發程序 2.高級語言就像是人類的語言&#xff0c;低級語言就像是一個全心全意幫我的社交專家&#xff0c;他幫我說服電腦實現我的指令 3.高級語言就是字節碼&#xff0c;低級語言幫我轉換成機器碼 4.有時候&#xff0c;高級語言的一個眼神&…

Java 試題四

Java 試題四 1、abstract class 和interface 有什么區別? 【基礎】 答&#xff1a;聲明方法的存在而不去實現它的類被叫做抽象類&#xff08;abstract class&#xff09;&#xff0c;它用于要創建一個體現某些基本行為的類&#xff0c; 并為該類聲明方法&#xff0c;但不能…

PyInstaller用法

pyinstaller定義&#xff1a;PyInstaller是一個壓縮python文件成為可執行程序的一個軟件。 pyinstaller工作原理&#xff1a;① 它會掃描你所有的Python文檔&#xff0c;并分析所有代碼從而找出所有你的代碼運行所需的模塊。② PyInstaller會將所有這些模塊和你的code放在一個文…

koa --- 監聽路由,并使用模板引擎渲染顯示

使用路由 /Koa實戰/routes/index.js const Router require(koa-router); const router new Router();router.get(/, ctx > {ctx.body index; });module.exports router/Koa實戰/routes/users.js const Router require(koa-router); const router new Router({prefi…

公共平臺服務治理與鑒權

問題 解決問題 鑒權 注冊 管理 總結聊一聊最近了解的公司服務治理平臺&#xff0c;主要是思想&#xff0c;理念&#xff0c;而不是一種技術或框架。整個平臺設計&#xff0c;融入了OAUTH2認證&#xff0c;融入了微服務思想&#xff0c;幫助公司各系統在復雜的IT架構下&#xff…