演算法 希爾排序

2021-10-03 12:10:23 字數 3583 閱讀 7110

插入排序是把序列的首個元素看做是有序的序列,然後把序列後面的元素往這個有序序列插入,其增量是1

希爾排序是直接插入排序的公升級版

插入排序:就是在排序的過程中,把陣列的每乙個元素按照大小關係,插入到前面有序區的對應位置。

插入排序的評價時間複雜度是o(n^2),它的特點是:

這個結論很明顯,如果乙個陣列大部分元素都有序,那麼陣列中的元素自然不需要頻繁地進行比較和交換。

這個結論更加顯而易見,插入排序的工作量和n的平方成正比,如果n比較小,那麼排序的工作量自然要小得多。

我們可以先對原始資料進行預先處理,提高資料的有序程度:逐步分組進行粗調,然後直接插入排序,即希爾排序

希爾排序的基本思想是:先將整個待排序的記錄序列分割成為若干個子串行分別進行直接插入排序,待整個序列中的記錄"基本有序"時,再對全體記錄進行依次直接插入排序

#

include

#include

#include

#include

template

<

typename

t>

std::ostream&

print

(std::ostream &out,t const

&val)

template

<

typenamet1,

typename

t2>

std::ostream&

print

(std::ostream &out,std::pair

const

&val) ")

;}template

<

template

<

typename

,typename..

.>

classtt,

typename..

. args>

std::ostream&

operator

<<

(std::ostream &out,tt

>

const

&cont)

void

swap

(int

& i,

int&j)

void

insertsort

(std::vector<

int>

&vec,

int gap)

for(

int i = gap; i < vec.

size()

; i++

) vec[pos + gap]

= backup;}}

void

shell

(std::vector<

int>

&vec)

for(

int gap = vec.

size()

/2; gap >

0; gap = gap /2)

}int

main()

;shell

(vec)

; std::cout << vec;

return0;

}

package main

import

"fmt"

func

shellsort

(arr [

]int)(

int)

else

return arr }}

func

shellsortstep

(arr[

]int

, gap int)[

]int

arr[pos + gap]

= backup

}return arr

}func

main()

fmt.

println

(shellsort

(arr))}

func

insertsort

(arr [

]int)[

]int

else

arr[pos +1]

= backup

}return arr

}}

package

com.company

;public

class

test_stack}}

// 因為它是分割槽排序,只能保證部分排序。所以不能只比較索引大的就能保證之前的索引位置都是有序的:因此需要從0開始}}

public

static

void

main

(string

args)

;int

arrry =

;shellsort2

(arrry)

;// 傳送的是位址

for(

int i:arrry)

}}

效率分析:雖然希爾排序是三層迴圈,最外層迴圈為log2(n)數量級,中間for迴圈是n數量級的,內迴圈遠遠低於n數量級,因為當分組較多時,組內元素較少;此迴圈次數少;當分組較少時,組內元素較多,但是此時已經接近有序,迴圈次數並不增長。因此,希爾排序的時間複雜度在o(nlog2(n))與o(n^2)

之間,大致為o(n^1.3)。

由於希爾排序對每個子串行單獨比較,在比較時進行元素移動,有可能改變相同排序碼元素的原始順序。因此希爾排序時不穩定的。

排序演算法 希爾排序

如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...

排序演算法 希爾排序

摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...

排序演算法 希爾排序

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,...