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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

直接插入排序与希尔排序

發(fā)布時(shí)間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 直接插入排序与希尔排序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

直接插入排序(Straight Insertion Sort):

????????一種最簡(jiǎn)單的排序方法,其基本操作是將一條記錄插入到已排好的有序表中,從而得到一個(gè)新的、記錄數(shù)量增1的有序表。

原理圖如下所示:

圖片取自:1.3 插入排序 | 菜鳥教程

?如上圖所示,默認(rèn)的就是第一位是已經(jīng)排序好的,然后對(duì)第二位和第一位進(jìn)行比較,如果第二位大于第一位,第二位不動(dòng),然后現(xiàn)在已排序的序列就由一個(gè)變?yōu)榱藘蓚€(gè)了,再由第三位和第二位進(jìn)行比較,如果第三位大于第二位,則不動(dòng),如果第三位小于第二位,第三位和第二位位置調(diào)換,再和第一位進(jìn)行比較,大了,不換位置,小了,交換位置......

大致原理就說(shuō)明白了,下面來(lái)進(jìn)行代碼的實(shí)現(xiàn):

void InsertSort(int* arr, int len)
{int tmp = 0;//用來(lái)存儲(chǔ)拿出來(lái)比較的值int j;  //出了內(nèi)層for循環(huán)還會(huì)用到j(luò) 所以搞個(gè)全局變量for (int i = 1; i < len; i++)  //i代表未排序序列中的第一個(gè)值(默認(rèn)第一個(gè)數(shù)組第一個(gè)已排序完成){arr[i] = tmp;//將該值取出來(lái)賦值給tmp,防止丟失for (j = i - 1; j >= 0; j--){if (arr[j] > tmp){arr[j + 1] = arr[j];}else{break;}}arr[j + 1] = tmp;//因?yàn)閠mp與arr[j]作比較的,如果tmp>arr[j]的話,特沒(méi)譜是插入在arr[j+1]的位置上}
}

希爾排序:

? ? ? ? 希爾排序是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。

該視頻教程簡(jiǎn)單易懂,推薦去看看!

[算法]六分鐘徹底弄懂希爾排序,簡(jiǎn)單易懂_嗶哩嗶哩_bilibilihttps://haokan.baidu.com/v?vid=9577557500401627062&pd=bjh&fr=bjhauthor&type=videohttps://www.bilibili.com/video/BV1rE411g7rW?from=search&seid=12091555806493200736&spm_id_from=333.337.0.0

原理圖如下所示:

?

?

?上述增量之間只有一個(gè)要求------->互質(zhì),上述我采用了1,3,5這三個(gè)互質(zhì)數(shù)字組成的增量數(shù)組,當(dāng)然你也可以將該增量數(shù)組寫成1,3,5,7都是沒(méi)問(wèn)題的

void Shell(int* arr, int len, int gap) //這塊gap = brr[i]
{int tmp = 0;int j;for (int i = gap; i < len; i++){tmp = arr[i];for (int j = i - 1; j >= 0; j -= gap){if (arr[j] > tmp){arr[j + 1] = arr[j];}else{break;}}arr[j + gap] = tmp;  //就是將直接插入排序的間隔由1變到了gap}
}void ShellSort(int* arr, int len)
{int brr[] = { 1,3,5 };//增量數(shù)組中一定要有1,最后得把數(shù)組遍歷一遍int len_brr = sizeof(brr) / sizeof(brr[0]);for (int i = 0; i < len_brr; i++){Shell(arr,len,brr[i]);}
}

這兩個(gè)排序比較簡(jiǎn)單 就不多敘述了? 到后面的歸并排序,堆排序,快速排序那塊的時(shí)候比較難一些會(huì)說(shuō)的詳細(xì)一些!

希爾排序的代碼實(shí)現(xiàn)和直接插入排序的實(shí)現(xiàn)方法基本一毛一樣,就是直接插入排序的間隔是1,而希爾排序的間隔是個(gè)數(shù)組brr[],每一輪使用brr[]中的互質(zhì)元素就好!

“堅(jiān)持住少年,堅(jiān)持終會(huì)見到明天的曙光,而大部分人都死在了今天的晚上!”

總結(jié)

以上是生活随笔為你收集整理的直接插入排序与希尔排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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