1. 程式人生 > >PHP 希爾排序

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等等。