<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          真香!10+圖來(lái)解析C語(yǔ)言希爾排序

          共 3050字,需瀏覽 7分鐘

           ·

          2021-08-09 21:30

          關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

          來(lái)源:嵌入式Linux



          希爾排序和插入排序很相似,有點(diǎn)像插入排序的升級(jí)版本。


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


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



          假設(shè),我們需要給下面的數(shù)據(jù)進(jìn)行排序:



          結(jié)合之前的文章,我們知道兩個(gè)數(shù)據(jù)的插入排序就是比較兩個(gè)數(shù)據(jù)的大小,然后進(jìn)行排列。


          希爾排序是通過(guò)分組+插入。


          首先,我們排序的數(shù)量是8個(gè),我們需要把數(shù)據(jù)分成8/2=4組,如下圖所示:



          對(duì)上面4組的數(shù)據(jù)進(jìn)行插入排序后得到:



          然后,再繼續(xù)分組8?2?2=2分成2組:



          這兩組數(shù)據(jù)再進(jìn)行插入排序,如下圖所示:



          這樣之后,整個(gè)數(shù)據(jù)的排序就差不多完成了。


          我們?cè)谶@個(gè)基礎(chǔ)上再對(duì)整個(gè)隊(duì)列執(zhí)行一次插入排序,就會(huì)完成了整個(gè)隊(duì)列的排序,因?yàn)橹耙呀?jīng)對(duì)數(shù)據(jù)進(jìn)行過(guò)排序,再進(jìn)行插入排序的時(shí)候,效率會(huì)明顯得到提升。



          整個(gè)過(guò)程可以觀看動(dòng)態(tài)圖片:



          代碼實(shí)現(xiàn)看看:


          #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)/*增量步長(zhǎng)*/
              {
                  /*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 8

          int mainint 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 


          接下來(lái)是代碼圖片解析,步長(zhǎng)等于4的時(shí)候,先進(jìn)行第一次插入排序:


           

          步長(zhǎng)等于2的時(shí)候,先進(jìn)行第二次插入排序:



          步長(zhǎng)等于1的時(shí)候,先進(jìn)行第三次插入排序,具體過(guò)程可以查看插入排序的文章:



          最后一次進(jìn)行插入排序之后,就會(huì)得到排序完成后的數(shù)列:


          來(lái)源:嵌入式Linux

          版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。

          ????????????????  END  ????????????????

          關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。

          歡迎關(guān)注我的視頻號(hào):


          點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩人妻在线免费观看 | 久青草资源福利视频 | 中文无码无字幕A久久东京热免费视频 | 亚洲字幕在线观看视频 | 欧美一级黄色片 |