PHP 希爾排序
該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。
以n=10的一個數組49, 38, 65, 97, 26, 13, 27, 49, 55, 4為例
第一次 gap = 10 / 2 = 5
49 38 65 97 26 13 27 49 55 4
1A 1B
2A 2B
3A 3B
4A 4B
5A 5B
1A,1B,2A,2B等為分組標記,數字相同的表示在同一組,大寫字母表示是該組的第幾個元素, 每次對同一組的資料進行直接插入排序。即分成了五組(49, 13) (38, 27) (65, 49) (97, 55) (26, 4)這樣每組排序後就變成了(13, 49) (27, 38) (49, 65) (55, 97) (4, 26),下同。
第二次 gap = 5 / 2 = 2
排序後
13 27 49 55 4 49 38 65 97 26
1A 1B 1C 1D 1E
2A 2B 2C 2D 2E
第三次 gap = 2 / 2 = 1
4 26 13 27 38 49 49 55 97 65
1A 1B 1C 1D 1E 1F 1G 1H 1I 1J
第四次 gap = 1 / 2 = 0 排序完成得到陣列:
4 13 26 27 38 49 49 55 65 97
例子:
<?php
/**
* 希爾排序
*/
function shell_sort(array $arr){
// 將$arr按升序排列
$len = count($arr);
$f = 3;// 定義因子
$h = 1;// 最小為1
while ($h < intval($len/$f)){
$h = $f*$h + 1; // 1, 4, 13, 40, 121, 364, 1093, ...
}
while ($h >= 1){ // 將陣列變為h有序
echo '<br>'.'h:'.$h.'<br>'.'<br>';
for ($i = $h; $i < $len; $i++){ // 將a[i]插入到a[i-h], a[i-2*h], a[i-3*h]... 之中 (演算法的關鍵
echo 'i:'.$i.'<br>';
for ($j = $i; $j >= $h && $arr[$j] < $arr[$j-$h]; $j -= $h){
$temp = $arr[$j];
$arr[$j] = $arr[$j-$h];
$arr[$j-$h] = $temp;
dump($arr);
}
}
$h = intval($h/$f);
}
return $arr;
}
$arr = array(14, 9, 1, 4, 6, -3, 2, 99, 13, 20, 17, 15, 3);
dump($arr);
$shell = shell_sort($arr);
echo '<pre>';
print_r($shell);
function dump($arr)
{
foreach ($arr as $value) {
echo $value.' ';
}
echo '<br>';
}
結果:
14 9 1 4 6 -3 2 99 13 20 17 15 3
h:4
i:4
6 9 1 4 14 -3 2 99 13 20 17 15 3
i:5
6 -3 1 4 14 9 2 99 13 20 17 15 3
i:6
i:7
i:8
6 -3 1 4 13 9 2 99 14 20 17 15 3
i:9
i:10
i:11
6 -3 1 4 13 9 2 15 14 20 17 99 3
i:12
6 -3 1 4 13 9 2 15 3 20 17 99 14
6 -3 1 4 3 9 2 15 13 20 17 99 14
3 -3 1 4 6 9 2 15 13 20 17 99 14
h:1
i:1
-3 3 1 4 6 9 2 15 13 20 17 99 14
i:2
-3 1 3 4 6 9 2 15 13 20 17 99 14
i:3
i:4
i:5
i:6
-3 1 3 4 6 2 9 15 13 20 17 99 14
-3 1 3 4 2 6 9 15 13 20 17 99 14
-3 1 3 2 4 6 9 15 13 20 17 99 14
-3 1 2 3 4 6 9 15 13 20 17 99 14
i:7
i:8
-3 1 2 3 4 6 9 13 15 20 17 99 14
i:9
i:10
-3 1 2 3 4 6 9 13 15 17 20 99 14
i:11
i:12
-3 1 2 3 4 6 9 13 15 17 20 14 99
-3 1 2 3 4 6 9 13 15 17 14 20 99
-3 1 2 3 4 6 9 13 15 14 17 20 99
-3 1 2 3 4 6 9 13 14 15 17 20 99
Array ( [0] => -3 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 6 [6] => 9 [7] => 13 [8] => 14 [9] => 15 [10] => 17 [11] => 20 [12] => 99 )
相關推薦
PHP 希爾排序
該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),
PHP實現排序演算法----希爾排序(Shell Sort)
基本思想: 希爾排序是指記錄按下標的一定增量分組,對每一組使用 直接插入排序 ,隨著增量逐漸減少,每組包含的關鍵字越來越多,當增量減少至 1 時,整個序列恰好被分成一組,演算法便終止。 操作步驟: 先取一個小於 n(序列記錄個數) 的整數 d1 作為第一個
PHP排序算法系列:希爾排序
希爾排序 希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。 原理 先將整個待排元素序列分割成若干個子序列(由相隔某個“增量(gap)”的元素組成的)分別進行直接
希爾排序
shells 思想 .com 復雜度 i++ 排序。 算法 時間復雜度 -1 在第一篇博客中論述了幾種排序的方法,這裏再論述一下另外一種排序方法:希爾排序 希爾(Shell)排序又稱為縮小增量排序,它是一種插入排序。它是直接插入排序算法的一種威力加強版。 希爾排
插入排序與希爾排序的
include#include"iostream"using namespace std;int insertsort(int a[],int size){//直接插入排序 for (int i = 0; i < size - 1; i++){ int temp = a[i+1];//保留要插入的點
經典排序算法--希爾排序
... ack 例子 理解 不知道 希爾 記錄 pre ava 算法簡介 希爾排序是1959 年由D.L.Shell 提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序。 白話理解: 我們依然已排隊為例,加入隊伍中,有一些小個子站在了隊伍的後面,而一些大個
算法系列【希爾排序】篇
javascript算法希爾排序 python算法希爾排序 go算法希爾排序 java算法希爾排序 常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸並排序、快速排序、堆排序、基數排序等。用一張圖概括: 關於時間復雜度:1. 平方階 (O(n2)) 排序各類簡單
排序算法<四>希爾排序
emp logs while arr ios pac shells str 直接插入排序 #include<iostream> using namespace std; int arr[]={11,12,51,23,64,23,68,1,12}; void s
希爾排序的溫習
void span [] oid %d before clas 希爾排序 col 希爾排序也是插入排序的一個方法。希爾排序先將待排序序列分割成若幹個子序列,分別進行插入排序。 1 #include <stdio.h> 2 3 void ShellIns
【算法拾遺(java描寫敘述)】--- 插入排序(直接插入排序、希爾排序)
ecan itblog insert med image java程序 can rip title 插入排序基本思想 每次將一個待排序的記錄按其keyword大小插入到前面已經拍好序的子文件的適當位置,直到全部記錄插入完畢為止。 直接插入
排序算法——希爾排序
應該 gap code 縮小 直接插入排序 color shells int 穩定 希爾排序 希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。 該方法因DL.Shell於1959
希爾排序(Go語言)
bsp color 數組下標 bre class else i++ 由於 emp func ShellSort(num []int) { //increment相隔數量 for increment:=len(num)/2;increment>0 ;
算法七之希爾排序
sys 關鍵詞 alt spa 最終 https 最優 src middle 一、希爾排序 (1)簡介 希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因DL.Shell於19
插入排序算法之直接插入排序和希爾排序
.cn 一定的 思路 value urn ges 高效 代碼 面向 插入排序算法 有一個已經有序的數據序列,要求在這個已經排好的數據序列中插入一個數,但要求插入後此數據序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將一個數據插入到已經排
(4)排序之希爾排序
減少 http 復雜度 需要 ... clas center 記錄 str 轉載:http://www.cnblogs.com/jingmoxukong/p/4303279.html 要點 希爾(Shell)排序又稱為縮小增量排序,它是一種插入排序。它是直接插入排序算法的一
排序--ShellSort 希爾排序
logs 如果 github str close blob www. 部分 什麽 希爾排序 no 實現 希爾排序其實就是插入排序。只不過希爾排序在比較的元素的間隔不是1。 我們知道插入排序 都是 一個一個和之前的元素比較。發現比之前元素小就交換位置。但是希爾排序可能
排序算法入門之希爾排序(java實現)
入門 介紹 插入 一次 變化 shells ngx i++ ava 希爾排序是對插入排序的改進。插入排序是前面元素已經有序了,移動元素是一個一個一次往後移動,當插入的元素比前面排好序的所有元素都小時,則需要將前面所有元素都往後移動。希爾排序有了自己的增量,可以理
希爾排序算法
規模 分鐘 連接 math java程序 public 基本 java 執行 希爾排序的基本思想 ①希爾排序又稱縮小增量排序 ,它本質上是一個插入排序算法。為什麽呢? 因為,對於插入排序而言,插入排序是將當前待排序的元素與前面所有的元素比較,而希爾排序是將當前元
數據結構--希爾排序和快速排序
循環控制 全部 元素 思想 print 序列 log display col 1 /*希爾排序:對插入排序的改進,其排序是按照一個增量序列來進行 2 *增量序列的個數就是排序的趟數。在任意增量K下,保證a[i]<=a[i+k] 3 *該算法的效率和增量需序
排序算法之希爾排序
java 排序算法 希爾排序希爾排序 先將整個待排序的序列分割成若幹個子序列分別進行直接插入排序,當整個序列的元素“基本有序”時,再對全體進行一次直接插入排序。需要註意的是,子序列的構成不是簡單的“逐段分割”,而是將相隔某個“增量”的記錄組成一個子序列,如第一趟增量為5,第二趟增量可以為3等等。