日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python算法与数据结构-希尔排序算法(35)

發(fā)布時間:2024/9/20 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python算法与数据结构-希尔排序算法(35) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

閱讀目錄

  • 一、希爾排序的介紹
  • 二、希爾排序的原理
  • 三、希爾排序的圖解 
  • 四、希爾排序的python代碼實現(xiàn)
  • 五、希爾排序的C語言實現(xiàn)
  • 六、希爾排序的時間復(fù)雜度
  • 七、希爾排序的穩(wěn)定性

一、希爾排序的介紹

  希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。 希爾排序是把記錄按下標(biāo)的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的記錄越來越多,當(dāng)增量減至1時,整個文件恰被分成一組,算法便終止。  

二、希爾排序的原理

  在前面文章中介紹的直接插入排序,它對于已經(jīng)基本有序的數(shù)據(jù)進(jìn)行排序,效率會很高,而如果對于最初的數(shù)據(jù)是倒序排列的,則每次比較都需要移動數(shù)據(jù),導(dǎo)致算法效率降低。

??????希爾排序的基本思想就是:將需要排序的序列邏輯上劃分為若干個較小的序列(但并非真的分割成若干分區(qū)),對這些邏輯上序列進(jìn)行直接插入排序,通過這樣的操作可使需要排序的數(shù)列基本有序,最后再使用一次直接插入排序。

??????在希爾排序中首先要解決的是怎樣劃分序列,對于子序列的構(gòu)成不是簡單地分段,而是采取將相隔某個增量的數(shù)據(jù)組成一個序列。一般選擇增量的規(guī)則是:取上一個增量的一半作為此次子序列劃分的增量,一般初始值元素的總數(shù)量的一半。

三、希爾排序的圖解 

四、希爾排序的python代碼實現(xiàn)

# 創(chuàng)建一個希爾排序的函數(shù) def shell_sort(alist):# 需要排序數(shù)組的個數(shù)N = len(alist)# 最初選取的步長gap = N//2# 根據(jù)每次不同的步長,對分組內(nèi)的數(shù)據(jù)進(jìn)行排序# 如果步長沒有減為1就繼續(xù)執(zhí)行while gap>0:# 對每個分組進(jìn)行插入排序,# 因為插入排序從第二個元素開始,而這里第二個元素的下標(biāo)就是gap# 所以i的起始點是gapfor i in range(gap,N):# 控制每個分組內(nèi)相鄰的兩個元素,邏輯上相鄰的兩個元素間距為gap,# j的前一個元素比它少一個gap距離,所以for循環(huán)中j的步長為 -gapfor j in range(i,0,-gap):# 判斷和邏輯上的分組相鄰的兩個數(shù)據(jù)大小if alist[j]<alist[j-gap] and j-gap>=0:# 交換temp = alist[j]alist[j] = alist[j-gap]alist[j-gap] = temp# 改變步長gap = gap//2numlist = [5,7,8,3,1,2,4,6,9] print("排序前:%s"%numlist) shell_sort(numlist) print("排序后:%s"%numlist)

運行結(jié)果為:

排序前:[5, 7, 8, 3, 1, 2, 4, 6, 9] 排序后:[1, 2, 3, 4, 5, 6, 7, 8, 9]

五、希爾排序的C語言實現(xiàn)

#include <stdio.h> // 創(chuàng)建一個希爾排序的函數(shù) void shell_sort(int arr[],int arrLength,int gap) {// 根據(jù)每次不同的步長,對分組內(nèi)的數(shù)據(jù)進(jìn)行排序// 如果步長沒有減為1就繼續(xù)執(zhí)行while (gap>0){// 對每個分組進(jìn)行插入排序,// 因為插入排序從第二個元素開始,而這里第二個元素的下標(biāo)就是gap,// 所以i的起始點是gapfor (int i = gap; i<arrLength; i++){// 控制每個分組內(nèi)相鄰的兩個元素,邏輯上相鄰的兩個元素間距為gap,// j的前一個元素比它少一個gap距離,所以for循環(huán)中j每次減少一個gap// 因為j-gap是上一個元素的下標(biāo),也必須保證大于等于0for (int j = i; j>0&&j-gap>=0; j=j-gap){// 判斷和邏輯上的分組相鄰的兩個數(shù)據(jù)大小if (arr[j]<arr[j-gap]){// 交換int temp = arr[j];arr[j] = arr[j-gap];arr[j-gap] = temp;}}}gap = gap/2;} }int main(int argc, const char * argv[]) {// 定義數(shù)組int array[] = {5,7,8,3,1,2,4,6,9};// 希爾排序的聲明void shell_sort(int arr[],int arrLength,int gap);// 計算數(shù)組長度int len = sizeof(array)/sizeof(int);// 制定gap為二分之一的長度int g = len/2;// 使用希爾排序shell_sort(array, len, g);// 驗證for (int i = 0; i<len; i++){printf("%d ",array[i]);}return 0; }

運行結(jié)果為:

1 2 3 4 5 6 7 8 9

?

六、希爾排序的時間復(fù)雜度

  • 最優(yōu)時間復(fù)雜度:根據(jù)步長序列的不同而不同
  • 最壞時間復(fù)雜度:O(n2)

七、希爾排序的穩(wěn)定性

  由于多次插入排序,我們知道一次插入排序是穩(wěn)定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最后其穩(wěn)定性就會被打亂,所以shell排序是不穩(wěn)定的。

?


侯哥語錄:我曾經(jīng)是一個職業(yè)教育者,現(xiàn)在是一個自由開發(fā)者。我希望我的分享可以和更多人一起進(jìn)步。分享一段我喜歡的話給大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么。當(dāng)你還沒有能力說不得時候,就努力讓自己變得強(qiáng)大,擁有說不得權(quán)利。"

來源:https://www.cnblogs.com/Se7eN-HOU/p/11079526.html

總結(jié)

以上是生活随笔為你收集整理的python算法与数据结构-希尔排序算法(35)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。