亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 邏輯算法 > 正文

PHP 排序算法之希爾排序

2020-03-22 16:21:44
字體:
來源:轉載
供稿:網友
希爾排序之交換排序

● 問題引入:

在插入排序中,如果數組元素的排列情況比較樂觀,那么插入的次數就比較少,那么效率就很高了,可是很多時候,數據就是那么的不敬人意,比如如下的一個待 /

排序的數組:[2,3,4,5,6,7,1],這個數組,如果使用插入排序,那么就會發生如下的樣子:

1. 第一輪:[2,3,4,5,6,7,7]

2. 第二輪:[2,3,4,5,6,6,7]

3. 第三輪:[2,3,4,5,5,6,7]

4. 第四輪:[2,3,4,4,5,6,7]

5. 第五輪:[2,3,3,4,5,6,7]

6. 第六輪:[2,2,3,4,5,6,7]

7. 第七輪:[1,2,3,4,5,6,7]

這樣的就是最不樂觀的情況,很浪費時間,所以,后來就有大神研究了一下,優化優化,就發明了希爾排序。

希爾排序 (Shell's Sort) 是插入排序的一種又稱 “縮小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版本。

希爾排序是非穩定排序算法。該方法因 D.L.Shell 于 1959 年提出而得名。

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至 1 時,

整個文件恰被分成一組,算法便終止

● 數組實例說明:

1. 比如有一個待排序的數組 [9,6,1,3,0,5.7,2,8,4]

2. 上面的數組一共有 10 個元素,它把數組第一次分為 10/2 = 5 組,然后兩兩比較,大小位置交換:如下:

<?php$arr = [9,6,1,3,0, 5,7,2,8,4];$arr[0] > $arr[5] ? '交換位置,小數交換在前,大數交換在后' : '不交換位置';$arr[1] > $arr[6] ? '交換位置,小數交換在前,大數交換在后' : '不交換位置';$arr[2] > $arr[7] ? '交換位置,小數交換在前,大數交換在后' : '不交換位置';$arr[3] > $arr[8] ? '交換位置,小數交換在前,大數交換在后' : '不交換位置';$arr[4] > $arr[9] ? '交換位置,小數交換在前,大數交換在后' : '不交換位置';for ($i = 5; $i < 10; $i++) {     for ($j = $i - 5; $j >= 0; $j-=5) {         if ($data[$j] > $data[$j+5]) {         $temp = $data[$j];         $data[$j] = $data[$j+5];         $data[$j+5] = $temp;          }      } }

最后第一輪得到的結果就是:[5,6,1,3,0,9,7,2,8,4]

3. 第二輪又開始比較,第二輪是在之前第一輪的基礎上,再次分為 5/2 = 2 組,然后兩兩交換位置,大小指互換:如下:

<?php$arr = [5,6,1,3,0,9,7,2,8,4];$arr[0] > $arr[2];//1,5  [1,6,5,3,0,9,7,2,8,4]$arr[2] > $arr[4];//0,5  [1,6,0,3,5,9,7,2,8,4]$arr[4] > $arr[6];//5,7  [1,6,0,3,5,9,7,2,8,4]$arr[6] > $arr[8];//7,8  [1,6,0,3,5,9,7,2,8,4]$arr[1] > $arr[3];//3,6  [1,3,0,6,5,9,7,2,8,4]$arr[3] > $arr[5];//6,9  [1,3,0,6,5,9,7,2,8,4]$arr[5] > $arr[7];//2,9  [1,3,0,6,5,2,7,9,8,4]$arr[7] > $arr[9];//4,9  [1,3,0,6,5,2,7,4,8,9]...for ($i = 2; $i < 10; $i++) {     for ($j = $i - 2; $j >= 0; $j-=2) {         if ($data[$j] > $data[$j+2]) {         $temp = $data[$j];         $data[$j] = $data[$j+2];         $data[$j+2] = $temp;          }      } }

最后得到的結果就是:[0,2,1,3,6,4,7,6,8,9]

4. 最后再次分組比較:2/2 = 1 組。也就是最后,每兩個都要比較,然后再次互換位置

<?php$arr = [0,2,1,3,5,4,7,6,8,9];$arr[0] > $arr[1];//[1,3,0,6,5,2,7,4,8,9]$arr[1] > $arr[2];//[1,0,3,6,5,2,7,4,8,9]$arr[2] > $arr[3];//[1,0,3,6,5,2,7,4,8,9]$arr[3] > $arr[4];//[1,0,3,5,6,2,7,4,8,9]$arr[4] > $arr[5];//[1,0,3,5,2,6,7,4,8,9]$arr[5] > $arr[6];//[1,0,3,5,2,6,7,4,8,9]$arr[6] > $arr[7];//[1,0,3,5,2,6,4,7,8,9]$arr[7] > $arr[8];//[1,0,3,5,2,6,4,7,8,9]$arr[8] > $arr[9];//[1,0,3,5,2,6,4,7,8,9]...for ($i = 1; $i < 10; $i++) {     for ($j = $i - 1; $j >= 0; $j-=1) {         if ($data[$j] > $data[$j+1]) {          $temp = $data[$j];          $data[$j] = $data[$j+1];         $data[$j+1] = $temp;         }     } }

最后就得到結果:[0,1,2,3,4,5,6,7,8,9]

● 完整代碼如下:

<?phphtml' target='_blank'>class ShellSort{ /*** Notes: 希爾排序之交換法排序 * User: LiYi/ * Date: 2019/11/12 0012/ * Time: 14:30/ * @param array $data/ * @return array/ *// public static function shellSortArray(array $data):array { if (!is_array($data)) { return ['message' => '必須傳入數組比較排序']; } $count = count($data);//得到數組的個數 //如果數組的個數小于等于1就直接返回 if ($count <= 1) {return $data;} //$gap 是每次減半的分組,直到只可以分為一組結束,在php里面需要注意,兩個整數相除,除不盡的情況下,得到的是一個浮點數,不是一個向下 //取整的的整數,所以在最后判斷gap 退出循環的時候,需要判斷它 >= 1 for ($gap = $count / 2; $gap >= 1; $gap /= 2) {         for ($i = $gap; $i < $count; $i++) {             for ($j = $i - $gap; $j >= 0; $j-=$gap) {                 if ($data[$j] > $data[$j+$gap]) {                 //這個地方是比較第一個數和它的步長做比較,交換也是一樣                 $temp = $data[$j];                  $data[$j] = $data[$j+$gap];                 $data[$j+$gap] = $temp;                 }             }         }     }     return $data; } public static function validate(array $data) {      if (!is_array($data)) {      return ['message' => '必須傳入數組比較排序'];     } $count = count($data);//得到數組的個數 //如果數組的個數小于等于1就直接返回 if ($count <= 1){ return $data; } return [$data, $count]; } /**/ * Notes: 希爾排序之移位法排序 * User: LiYi * Date: 2019/11/12 0012 * Time: 14:29 * @param array $data * @return array*/ public static function ShellSortMoveArray(array $data) { $count = count($data);//得到數組總數 for ($gap = $count / 2; $gap > 0; $gap /= 2) { //縮小增量,每次減半 $gap = floor($gap); for ($i = $gap; $i < $count; $i++) { // $insertIndex = $i;//待插入元素的下表 $insertValue = $data[$insertIndex];//待插入元素的值 echo "insertIndex=$insertIndex" . PHP_EOL; echo "insertValue=$insertValue" . PHP_EOL; if ($data[$insertIndex] < $data[$insertIndex - $gap]) { //判斷待插入元素和它步長的元素比較,待插入元素小就進入循環 //判斷是否越界了,第一個元素的下標是要大于等于0的,否則退出循環 //判斷后面的元素比前面的元素小,進入循環,否則退出循環 while ($insertIndex - $gap >= 0 && $insertValue < $data[$insertIndex - $gap]) { //把步長前面的大的值向后移動 $data[$insertIndex] = $data[$insertIndex - $gap]; $insertIndex -= $gap;//每循環一次就把帶插入的坐標減去補償/ } //把帶插的小值插入到前面 $data[$insertIndex] = $insertValue; } } } return $data; } public static function testShellOne(array $data) { $temp = 0; $count = count($data); for ($i = 5; $i < $count; $i++) { for ($j = $i - 5; $j >= 0; $j-=5) { if ($data[$j] > $data[$j+5]) { $temp = $data[$j]; $data[$j] = $data[$j+5]; $data[$j+5] = $temp; } } } for ($i = 2; $i < $count; $i++) { for ($j = $i - 2; $j >= 0; $j-=2) { if ($data[$j] > $data[$j+2]) { $temp = $data[$j]; $data[$j] = $data[$j+2]; $data[$j+2] = $temp;  }  }   } for ($i = 1; $i < 10; $i++) { for ($j = $i - 1; $j >= 0; $j-=1) { if ($data[$j] > $data[$j+1]) { $temp = $data[$j]; $data[$j] = $data[$j+1]; $data[$j+1] = $temp; }  } } var_dump($data); } }var_dump(ShellSort::shellSortMoveArray([0 => 9, 1 => 6, 2 => 1, 3 => 3, 4 => 0, 5 => 5, 6 => 7, 7 => 2, 8 => 8, 9 => 4]));// $gap = 10 / 2 = 5// $insertIndex  = $i = $gap = 5// $insertValue = $data[$insertIndex] = $data[5] = 5;// $data[$insertIndex] < $data[$insertIndex - $gap] == $data[5] < $data[5-5] = $data[0] ==> 5 < 9// while(5 - 5 >= 0 && 5 < 9) {//  $data[5] = $data[5-5] = $data[0] = 9//  $insertIndex -= 5 = 0;//}// $data[$insertIndex] = $data[0] = $insertValue = 5// $i++ = 6;// $insertIndex  = $i =  6// $insertValue = $data[$insertIndex] = $data[6] = 7;// $data[$insertIndex] < $data[$insertIndex - $gap] == $data[6] < $data[6-5] = $data[1] ==> 7 < 6// $i++ = 7;// $insertIndex  = $i =  7// $insertValue = $data[$insertIndex] = $data[7] = 2;// $data[$insertIndex] < $data[$insertIndex - $gap] == $data[7] < $data[7-5] = $data[2] ==> 2 < 1// $i++ = 8;// $insertIndex  = $i =  8// $insertValue = $data[$insertIndex] = $data[8] = 8;// $data[$insertIndex] < $data[$insertIndex - $gap] == $data[8] < $data[8-5] = $data[3] ==> 8 < 3// $i++ = 9;// $insertIndex  = $i =  9// $insertValue = $data[$insertIndex] = $data[9] = 4;// $data[$insertIndex] < $data[$insertIndex - $gap] == $data[9] < $data[9-5] = $data[4] ==> 4 < 0

以上就是PHP 排序算法之希爾排序的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲黄页视频免费观看| 亚洲国产精品嫩草影院久久| 欧美孕妇与黑人孕交| 久久久久久久成人| 欧美日本国产在线| 午夜精品久久久久久久男人的天堂| 久久亚洲影音av资源网| 欧美猛交ⅹxxx乱大交视频| 欧美最顶级丰满的aⅴ艳星| 欧洲美女7788成人免费视频| 成人久久久久爱| 亚洲福利视频二区| 欧美精品成人在线| 欧美精品videos性欧美| 国产精品99久久99久久久二8| 成人欧美一区二区三区在线| 亚洲天堂av网| 热99精品里视频精品| 91久久久国产精品| 国产精品美女在线| 韩国日本不卡在线| 欧美一级在线播放| 亚洲色图欧美制服丝袜另类第一页| 国产一区二区三区在线播放免费观看| 成人久久18免费网站图片| 日韩有码视频在线| 成人日韩在线电影| 欧美日韩在线另类| 色婷婷**av毛片一区| 国产婷婷97碰碰久久人人蜜臀| 日本一区二区三区四区视频| 国产精品一区二区三区成人| 亚洲一区二区三区乱码aⅴ| 欧美亚洲在线播放| 中文字幕成人在线| 岛国av在线不卡| 国内精品久久久| 亚洲国产精品字幕| 超在线视频97| 国产成人精品久久二区二区| 日韩欧美国产高清91| 国产精品久久久久99| 亚洲成人久久网| 欧美黑人性生活视频| 福利二区91精品bt7086| 亚洲男人天堂视频| 91日韩在线播放| 欧美成人精品三级在线观看| 久久久999精品视频| 欧美激情视频在线| 国产亚洲精品高潮| 91香蕉嫩草神马影院在线观看| 国产一区二区在线免费视频| 国外成人在线播放| 中文字幕日韩欧美| 欧美一级在线播放| 欧美三级欧美成人高清www| 欧美激情国产日韩精品一区18| 成人美女av在线直播| 日韩精品久久久久久福利| 中文字幕日韩有码| 国产亚洲视频在线| 国产精品中文字幕在线| 国产精品美女主播在线观看纯欲| 国产精品亚洲视频在线观看| 亚洲电影第1页| 日韩中文字幕亚洲| 久久伊人精品视频| 欧美日韩精品二区| 97精品视频在线播放| 国产欧美日韩中文字幕在线| 91精品国产综合久久久久久久久| 欧美日韩国产一中文字不卡| 国产69精品久久久久99| 亚洲国产欧美一区| 欧美亚洲国产另类| 亚洲一区二区三区毛片| 久久亚洲精品小早川怜子66| 国产精品久在线观看| 亚洲福利精品在线| 久久中文久久字幕| 日韩欧美国产高清91| 国产欧美韩国高清| 国产精自产拍久久久久久| 国产大片精品免费永久看nba| 亚洲国产私拍精品国模在线观看| 亚洲男人天堂2019| 国产成人综合久久| 免费99精品国产自在在线| 亚洲精品720p| 国产精品综合久久久| 成人午夜在线观看| 福利一区福利二区微拍刺激| 国产精品美女www爽爽爽视频| 国产精品综合网站| 自拍偷拍亚洲欧美| 亚洲精品资源美女情侣酒店| 日本精品一区二区三区在线播放视频| 亚洲人成电影网站| 国产精品综合不卡av| 日韩视频免费中文字幕| 精品在线欧美视频| 中文字幕久精品免费视频| 在线免费观看羞羞视频一区二区| 日韩成人中文字幕| 久久久久久国产精品三级玉女聊斋| 精品自在线视频| 久久精品视频播放| 自拍偷拍亚洲在线| 欧美激情视频一区二区| 欧美日韩国产在线看| 精品福利一区二区| 欧美成人免费大片| 国产精品成人aaaaa网站| 57pao成人永久免费视频| 少妇av一区二区三区| 国产精品中文久久久久久久| 久久国产精品久久久久久久久久| 亚洲国产成人精品一区二区| 国产日韩欧美夫妻视频在线观看| 精品国产一区二区三区在线观看| 中文国产成人精品| 亚洲一区二区三区视频| 国产欧美一区二区白浆黑人| 亚洲第一中文字幕在线观看| 粉嫩av一区二区三区免费野| 亚洲免费中文字幕| 亚洲一区二区三区四区在线播放| 免费91麻豆精品国产自产在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 欧美国产日韩一区| 成人网在线免费看| 欧美日韩国产综合视频在线观看中文| 91视频国产高清| 国产精品av电影| 日韩理论片久久| 57pao国产成人免费| 亚洲乱码一区av黑人高潮| 欧洲成人免费视频| 国产精品精品视频| 亚洲欧洲日韩国产| 欧美日韩精品国产| 亚洲精品福利在线| 欧美成在线观看| 91精品国产自产91精品| 国产精品第8页| 欧美丝袜一区二区| 国产精品久在线观看| 91中文字幕在线观看| 中文字幕精品www乱入免费视频| 欧美激情日韩图片| 91久久在线观看| 成人亚洲欧美一区二区三区| 久久精品亚洲国产| 久久视频免费在线播放| 九九热这里只有精品免费看| 亚洲欧洲一区二区三区在线观看| 热re99久久精品国产66热| 精品一区二区三区电影| 亚洲自拍偷拍色图| 欧美成人自拍视频| 成人免费激情视频| 超碰97人人做人人爱少妇| 高清欧美一区二区三区|