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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图解,C语言希尔排序

發布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解,C语言希尔排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

希爾排序和插入排序很相似,有點像插入排序的升級版本。

希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之后的一個更高效的版本,也稱為縮小增量排序,同時該算法是沖破O(n2)的第一批算法之一

希爾排序也是一種插入排序算法,只不過在插入排序上突破了結界,達到了另一種頂峰的存在,這種頂峰使得時間復雜度變成「O(nLogn)~O(n^2)」。

假設我們需要給下面的數據進行排序

結合之前的文章,我們知道兩個數據的插入排序就是比較兩個數據的大小,然后進行排列。

希爾排序是通過分組+插入

首先我們排序的數量是 8 個,我們需要把數據分成 8/2 = 4組。

如下圖

對上面4組的數據進行插入排序后得到

然后再繼續分組?8?2?2 = 2 分成 2組

這兩組數據再進行插入排序

如下圖

這樣之后,整個數據的排序差不多完成

我們在這個基礎上再對整個隊列執行一次插入排序,就會完成了整個隊列的排序,因為之前已經對數據進行過排序,再進行插入排序的時候,效率會明顯得到提升。

整個過程可以觀看動態圖片

代碼實現看看

#include?<stdio.h> #include?<stdlib.h> #include?<string.h>int?shell_sort(int?arr[],int?n) {register?int?i,?j,?tmp;int?step;for(step?=?n/2;?step?>?0;step?/=?2)/*增量步長*/{/*step?=?4?2?1*/for(i?=?step;?i?<?n;?i++){tmp?=?arr[i];j?=?i?-?step;for(;j?>=?0?&&?tmp?<?arr[j];){arr[j?+?step]?=?arr[j];j?-=?step;}arr[j?+?step]?=?tmp;}} }#define?LENGTH?8int?main(?int?argc,?int?*argv[]) {int?i;int?arr[LENGTH]?=?{6,5,3,1,8,7,2,4};for(i=0;i<LENGTH;i++)printf("%d?",arr[i]);printf("\n");shell_sort(arr,LENGTH);for(i?=?0;i?<?LENGTH;i++)printf("%d?",?arr[i]);printf("\n"); }

代碼輸出

6?5?3?1?8?7?2?4? 1?2?3?4?5?6?7?8?

代碼圖片解析

步長等于4的時候,先進行第一次插入排序

?

步長等于2的時候,先進行第二次插入排序

步長等于1的時候,先進行第三次插入排序

具體過程可以查看插入排序的文章

最后一次進行插入排序之后,就會得到排序完成后的數列


推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。

歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~

總結

以上是生活随笔為你收集整理的图解,C语言希尔排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。