Hark的数据结构与算法练习之希尔排序
生活随笔
收集整理的這篇文章主要介紹了
Hark的数据结构与算法练习之希尔排序
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
算法說(shuō)明
希爾排序是插入排序的優(yōu)化版。
插入排序的最壞時(shí)間復(fù)雜度是O(n2),但如果要排序的數(shù)組是一個(gè)幾乎有序的數(shù)列,那么會(huì)降低有效的減低時(shí)間復(fù)雜度。
希爾排序的目的就是通過(guò)一個(gè)increment(增量)來(lái)對(duì)數(shù)列分組進(jìn)行交換排序,最終使數(shù)列幾乎有序,最后再執(zhí)行插入排序,統(tǒng)計(jì)出結(jié)果。
通過(guò)increment=n/2, 也就是如果9個(gè)數(shù)的話(huà),增量為4,2,1。 ? 如果是20個(gè)數(shù)的話(huà),增量就是10,5,2,1。 ?當(dāng)increment為1時(shí),其實(shí)對(duì)幾乎有序的數(shù)列進(jìn)行插入排序啦啦。
?
?
?
時(shí)間復(fù)雜度
O(n2/3)
?
空間復(fù)雜度
O(1)
?
代碼
使用的是Java
/** 希爾排序*/ public class ShellSort {public static void main(String[] args) {int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };ShellSortMethod(arrayData);for (int integer : arrayData) {System.out.print(integer);System.out.print(" ");}}public static void ShellSortMethod(int[] arrayData) {int i, j, temp = 0;int increment = arrayData.length;do {increment = increment / 2; //增量for (i = increment; i < arrayData.length; i++) {if (arrayData[i] > arrayData[i - increment]) { //判斷是否要進(jìn)行插入排序temp = arrayData[i]; //將要插入的值存放在臨時(shí)變量中//這里其實(shí)做的就是插入排序,將以增量為步長(zhǎng),往后移動(dòng)。 //temp > arrayData[j] 這個(gè)是要注意的,只會(huì)移動(dòng)比要插入的值小的數(shù)字for (j = i - increment; j >= 0 && temp > arrayData[j]; j -= increment) {arrayData[j + increment] = arrayData[j];}arrayData[j + increment] = temp;}}} while (increment > 0);} }
結(jié)果
9 8 7 6 5 4 3 2 1?
總結(jié)
以上是生活随笔為你收集整理的Hark的数据结构与算法练习之希尔排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 影院平台搭建 - (6)一个靠谱的视频播
- 下一篇: 直接打印报表