Java對(duì)數(shù)組實(shí)現(xiàn)選擇排序算法的實(shí)例詳解
一. 算法描述
選擇排序:比如在一個(gè)長(zhǎng)度為N的無(wú)序數(shù)組中,在第一趟遍歷N個(gè)數(shù)據(jù),找出其中最小的數(shù)值與第一個(gè)元素交換,第二趟遍歷剩下的N-1個(gè)數(shù)據(jù),找出其中最小的數(shù)值與第二個(gè)元素交換......第N-1趟遍歷剩下的2個(gè)數(shù)據(jù),找出其中最小的數(shù)值與第N-1個(gè)元素交換,至此選擇排序完成。
以下面5個(gè)無(wú)序的數(shù)據(jù)為例:
56 12 80 91 20(文中僅細(xì)化了第一趟的選擇過(guò)程)
第1趟:12 56 80 91 20
第2趟:12 20 80 91 56
第3趟:12 20 56 91 80
第4趟:12 20 56 80 91
二. 算法分析
平均時(shí)間復(fù)雜度:O(n2)
空間復(fù)雜度:O(1) (用于交換和記錄索引)
穩(wěn)定性:不穩(wěn)定 (比如序列【5, 5, 3】第一趟就將第一個(gè)[5]與[3]交換,導(dǎo)致第一個(gè)5挪動(dòng)到第二個(gè)5后面)
三. 算法實(shí)現(xiàn)
public class SelectionSort { public static void main(String[] args) { int len = 15; int[] ary = new int[len]; Random random = new Random(); for (int j = 0; j < len; j++) { ary[j] = random.nextInt(1000); } System.out.println("-------排序前------"); // ary=new int[]{10,9,8,7,6,5,4,3,2,1}; //測(cè)試交換次數(shù) // ary=new int[]{1,2,3,4,5,6,7,8,10,9}; //測(cè)試交換次數(shù) for (int j = 0; j < ary.length; j++) { System.out.print(ary[j] + " "); } selectDesc(ary); selectAsc(ary); } /* * 選擇排序:降序 */ static void selectDesc(int[] ary) { int compareCount = 0;//比較次數(shù) int changeCount = 0;//交換次數(shù) int len = ary.length; int maxValueIndex = -1; //記錄一輪比較下來(lái)的最小值索引 for (int i = 0; i < len - 1; i++) { maxValueIndex = i; //從0開始 for (int j = i + 1; j < len; j++) { if (ary[maxValueIndex] < ary[j]) { maxValueIndex = j; //記錄較大的索引 compareCount++; } } // System.out.println("minValueIndex==" + maxValueIndex); if (maxValueIndex != i) {//如果跟左邊的記錄索引不同,則交換 ary[i] = ary[maxValueIndex] + (ary[maxValueIndex] = ary[i]) * 0;//一步交換 changeCount++; } } System.out.println("\n-------降序排序后------比較次數(shù):" + compareCount + ",交換次數(shù)" + changeCount); for (int j = 0; j < ary.length; j++) { System.out.print(ary[j] + " "); } } /* * 選擇排序:升序 */ static void selectAsc(int[] ary) { int compareCount = 0, changeCount = 0; int len = ary.length; int minIndex = -1; for (int i = 0; i < len - 1; i++) { minIndex = i; for (int j = i + 1; j < len; j++) { if (ary[minIndex] > ary[j]) { minIndex = j; //記錄較小的索引 compareCount++; } } if (minIndex != i) {//如果跟左邊的記錄索引不同,則交換 ary[i] = ary[minIndex] + (ary[minIndex] = ary[i]) * 0; changeCount++; } } System.out.println("\n-------升序排序后------比較次數(shù):" + compareCount + ",交換次數(shù)" + changeCount); for (int j = 0; j < ary.length; j++) { System.out.print(ary[j] + " "); } } }
打印
-------排序前------ 125 350 648 789 319 699 855 755 552 489 187 916 596 731 852 -------降序排序后------比較次數(shù):26,交換次數(shù)13 916 855 852 789 755 731 699 648 596 552 489 350 319 187 125 -------升序排序后------比較次數(shù):56,交換次數(shù)7 125 187 319 350 489 552 596 648 699 731 755 789 852 855 916
相關(guān)文章
基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解
這篇文章主要介紹了基于SpringBoot集成測(cè)試遠(yuǎn)程連接的Redis服務(wù)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Springboot如何統(tǒng)一處理Filter異常
這篇文章主要介紹了Springboot如何統(tǒng)一處理Filter異常問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java 基礎(chǔ)之NIO 學(xué)習(xí)詳解
這篇文章主要介紹了java基礎(chǔ)之NIO介紹及使用,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-09-09JAVA OutputStreamWriter流的實(shí)現(xiàn)
OutputStreamWriter是從字符流到字節(jié)流的橋接,它使用的字符集可以通過(guò)名稱指定,也可以明確指定,或者可以接受平臺(tái)的默認(rèn)字符集,本文詳細(xì)的介紹了JAVA OutputStreamWriter流的使用,感興趣的可以了解一下2021-06-06SpringBoot實(shí)現(xiàn)登錄校驗(yàn)(JWT令牌)
JWT全稱為JSON Web Token,是一種用于身份驗(yàn)證的開放標(biāo)準(zhǔn),本文主要介紹了SpringBoot實(shí)現(xiàn)登錄校驗(yàn)(JWT令牌),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12jmeter接口測(cè)試教程及接口測(cè)試流程詳解(全網(wǎng)僅有)
Jmeter是由Apache公司開發(fā)的一個(gè)純Java的開源項(xiàng)目,即可以用于做接口測(cè)試也可以用于做性能測(cè)試。本文給大家分享jmeter接口測(cè)試教程及接口測(cè)試流程,感興趣的朋友跟隨小編一起看看吧2021-12-12