Java 選擇排序、插入排序、希爾算法實(shí)例詳解
1、基本思想:
在要排序的一組數(shù)中,選出最小的一個(gè)數(shù)與第一個(gè)位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小的與第二個(gè)位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個(gè)數(shù)和最后一個(gè)數(shù)比較為止?! ?br />
2、實(shí)例
3、算法實(shí)現(xiàn)
/** * 選擇排序算法 * 在未排序序列中找到最小元素,存放到排序序列的起始位置 * 再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小元素,然后放到排序序列末尾。 * 以此類推,直到所有元素均排序完畢。 * @param numbers */ public static void selectSort(int[] numbers) { int size = numbers.length; //數(shù)組長(zhǎng)度 int temp = 0 ; //中間變量 for(int i = 0 ; i < size ; i++) { int k = i; //待確定的位置 //選擇出應(yīng)該在第i個(gè)位置的數(shù) for(int j = size -1 ; j > i ; j--) { if(numbers[j] < numbers[k]) { k = j; } } //交換兩個(gè)數(shù) temp = numbers[i]; numbers[i] = numbers[k]; numbers[k] = temp; } }
二、插入排序
1、基本思想:每步將一個(gè)待排序的記錄,按其順序碼大小插入到前面已經(jīng)排序的字序列的合適位置(從后向前找到合適位置后),直到全部插入排序完為止。
2、實(shí)例
3、算法實(shí)現(xiàn)
/** * 插入排序 * * 從第一個(gè)元素開(kāi)始,該元素可以認(rèn)為已經(jīng)被排序 * 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描 * 如果該元素(已排序)大于新元素,將該元素移到下一位置 * 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置 * 將新元素插入到該位置中 * 重復(fù)步驟2 * @param numbers 待排序數(shù)組 */ public static void insertSort(int[] numbers) { int size = numbers.length; int temp = 0 ; int j = 0; for(int i = 0 ; i < size ; i++) { temp = numbers[i]; //假如temp比前面的值小,則將前面的值后移 for(j = i ; j > 0 && temp < numbers[j-1] ; j --) { numbers[j] = numbers[j-1]; } numbers[j] = temp; } }
4、效率:
時(shí)間復(fù)雜度:O(n^2).
三、希爾算法
1、基本思想:
先將整個(gè)待排序的記錄序列分割成為若干子序列分別進(jìn)行直接插入排序,待整個(gè)序列中的記錄“基本有序”時(shí),再對(duì)全體記錄進(jìn)行依次直接插入排序。
2、操作方法:
選擇一個(gè)增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列個(gè)數(shù)k,對(duì)序列進(jìn)行k 趟排序;
每趟排序,根據(jù)對(duì)應(yīng)的增量ti,將待排序列分割成若干長(zhǎng)度為m 的子序列,分別對(duì)各子表進(jìn)行直接插入排序。僅增量因子為1 時(shí),整個(gè)序列作為一個(gè)表來(lái)處理,表長(zhǎng)度即為整個(gè)序列的長(zhǎng)度。
希爾排序的示例:
3、算法實(shí)現(xiàn):
/**希爾排序的原理:根據(jù)需求,如果你想要結(jié)果從大到小排列,它會(huì)首先將數(shù)組進(jìn)行分組,然后將較大值移到前面,較小值 * 移到后面,最后將整個(gè)數(shù)組進(jìn)行插入排序,這樣比起一開(kāi)始就用插入排序減少了數(shù)據(jù)交換和移動(dòng)的次數(shù),可以說(shuō)希爾排序是加強(qiáng) * 版的插入排序 * 拿數(shù)組5, 2, 8, 9, 1, 3,4來(lái)說(shuō),數(shù)組長(zhǎng)度為7,當(dāng)increment為3時(shí),數(shù)組分為兩個(gè)序列 * 5,2,8和9,1,3,4,第一次排序,9和5比較,1和2比較,3和8比較,4和比其下標(biāo)值小increment的數(shù)組值相比較 * 此例子是按照從大到小排列,所以大的會(huì)排在前面,第一次排序后數(shù)組為9, 2, 8, 5, 1, 3,4 * 第一次后increment的值變?yōu)?/2=1,此時(shí)對(duì)數(shù)組進(jìn)行插入排序, *實(shí)現(xiàn)數(shù)組從大到小排 */ public static void shellSort(int[] data) { int j = 0; int temp = 0; //每次將步長(zhǎng)縮短為原來(lái)的一半 for (int increment = data.length / 2; increment > 0; increment /= 2) { for (int i = increment; i < data.length; i++) { temp = data[i]; for (j = i; j >= increment; j -= increment) { if(temp > data[j - increment])//如想從小到大排只需修改這里 { data[j] = data[j - increment]; } else { break; } } data[j] = temp; } } }
4、效率
時(shí)間復(fù)雜度:O(n^2).
4、各種算法的時(shí)間復(fù)雜度
以上所述是小編給大家介紹的Java 選擇排序、插入排序、希爾算法實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼
本篇文章主要介紹了SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02java處理異常的機(jī)制關(guān)鍵字throw和throws使用解析
這篇文章主要介紹了java處理異常的機(jī)制關(guān)鍵字throw和throws使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09myeclipse開(kāi)發(fā)servlet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
MyEclipse,是在eclipse基礎(chǔ)上加上自己的插件開(kāi)發(fā)而成的功能強(qiáng)大的企業(yè)級(jí)集成開(kāi)發(fā)環(huán)境,主要用于Java、Java EE以及移動(dòng)應(yīng)用的開(kāi)發(fā)。下面這篇文章主要給大家介紹了關(guān)于myeclipse開(kāi)發(fā)servlet的相關(guān)資料,需要的朋友可以參考下。2017-07-07詳解Spring boot Admin 使用eureka監(jiān)控服務(wù)
本篇文章主要介紹了詳解Spring boot Admin 使用eureka監(jiān)控服務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理分析
這篇文章主要介紹了java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java組件commons fileupload實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了Java組件commons fileupload實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)使用操作(一對(duì)一、一對(duì)多、多對(duì)多)
這篇文章主要介紹了Spring?Boot?整合JPA?數(shù)據(jù)模型關(guān)聯(lián)操作(一對(duì)一、一對(duì)多、多對(duì)多),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Java實(shí)現(xiàn)DFA算法對(duì)敏感詞、廣告詞過(guò)濾功能示例
本篇文章主要介紹了Java實(shí)現(xiàn)DFA算法對(duì)敏感詞、廣告詞過(guò)濾功能示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11