排序算法学习之路--表插入排序--迹忆博客
在插入排序(概念)中简单的提到了表插入排序。我简单的总结了一下,写下这篇文章,有需要的可以参考一下。
表插入排序,顾名思义,借助一个索引表对原表进行插入排序,这样做的好处就是省去了对原来表中元素的移动过程。当然单一的整数数组(仅作为试验用)移动元素也是挺方便的,但是对于结构有些复杂的表来说,要想移动表中的元素那可真真不是一件容易的事情了。举个例子(以下PHP中的二维数组)
$arr = array (
1=> array ("uname"=>'张三','age'=>20,'occu'=>'PHP程序员'),
2=> array ("uname"=>'李四','age'=>27,'occu'=>'PHP程序员'),
3=> array ("uname"=>'赵五','age'=>19,'occu'=>'PHP程序员'),
4=> array ("uname"=>'王六','age'=>33,'occu'=>'PHP程序员'),
5=> array ("uname"=>'刘大','age'=>35,'occu'=>'PHP程序员'),
6=> array ("uname"=>'公子纠','age'=>29,'occu'=>'PHP程序员'),
7=> array ("uname"=>'公子小白','age'=>26,'occu'=>'PHP程序员'),
8=> array ("uname"=>'管仲','age'=>80,'occu'=>'PHP程序员'),
9=> array ("uname"=>'孔丘','age'=>76,'occu'=>'PHP程序员'),
10=> array ("uname"=>'曾子','age'=>66,'occu'=>'PHP程序员'),
11=> array ("uname"=>'子思','age'=>55,'occu'=>'PHP程序员'),
12=> array ("uname"=>'左丘明','age'=>32,'occu'=>'PHP程序员'),
13=> array ("uname"=>'孟子','age'=>75,'occu'=>'PHP程序员'),
14=> array ("uname"=>'宋襄公','age'=>81,'occu'=>'PHP程序员'),
15=> array ("uname"=>'秦穆公','age'=>22,'occu'=>'PHP程序员'),
16=> array ("uname"=>'楚庄王','age'=>45,'occu'=>'PHP程序员'),
17=> array ("uname"=>'赵盾','age'=>58,'occu'=>'PHP程序员'),
18=> array ("uname"=>'廉颇','age'=>18,'occu'=>'PHP程序员'),
19=> array ("uname"=>'蔺相如','age'=>39,'occu'=>'PHP程序员'),
20=> array ("uname"=>'老子','age'=>100,'occu'=>'PHP程序员'),
);
对于此数组,假如我们只是对age进行排序,但是又不想改变每个元素的位置,这是我们就可以使用表插入排序。借助一个索引表对当前表进行排序。
好了,下面我们开始对表插入排序来分析分析。首先我们需要一张索引表,表结构如下(依然是以php为例)
array (
index=> array ('next'=>值)
)
index 为元素在原来表中的索引next 指向其下一个索引
举个例子 有以下元素需要排序
我们暂且认为其下标是从1开始的,0位作为开头索引。那么经过排序以后其索引表(称其为B表)如下
接下来我们根据这个例子一步步构造此索引表
第一步:初始化索引表 置其两个元素
第二步:遍历A表,当前是A表中的第2个元素值为5 。然后从索引表(以后我们都称其为B表)0位的next值开始,依次比较A[$next] 和 5 的大小 终止遍历B表的条件有两个,一是$next为0 二是A[$next] 要大于或者等于5
A[1]大于5 所以对B表做更改 B[0]的next值为2 B[2]的next值为1 如下
$next = B[0][next] 开始为1
while($next 不等于0){
if(A[$next]
$next = B[$next][next] 此时$next值为0
If(A[$next]>=5)
跳出循环
}
If($next等于0 ) //说明直到B表中的最后一个元素仍然没有比5大的元素 则将B[2]的next 值置为0,B[1]的next值置为2 其它的不变
If($next 不等于0) //说明A[$next]值大于等于 5 则将 B[0][next] 置为2 ,B[2][next]置为1
第三步遍历A表,当前是A表中的第3个元素值为9 。步骤同第二步,这里不再赘述。经过第三步,A、B表如下
B[3][next] = B[2][next]
B[2][next] = 3
第四步:同第二步 A、B表如下
B[4][next] = B[2][next]
B[2][next] = 4
至此索引表的构建方式就已经介绍完了。不知道有没有给大家介绍清楚,如果有不清楚的地方可以在下面留言,看到后我会第一时间回复。
下面我们用PHP实现表插入排序 测试数据就用文章开头的二维数组
$link = array (); //链表
$link [0]= array ('next'=>1);//初始化链表 $link第一个元素仅仅作为头部
$link [1]= array ('next'=>0); //将第一个元素放入$link
/*
* 开始遍历数组 从第二个元素开始
*/
for ( $i =2; $i
$p = $arr [ $i ]; //存储当前待排序的元素
$index =0;
$next = 1; //从开始位置查找链表
while ( $next !=0){
if ( $arr [ $next ]['age']
$index = $next ;
$next = $link [ $next ]['next'];
}
else break ;
}
if ( $next == 0){
$link [ $i ]['next'] = 0;
$link [ $index ]['next'] = $i ;
} else {
$link [ $i ]['next']= $next ;
$link [ $index ]['next']= $i ;
}
}
至此索引表已经构建完成,只要遍历此索引表就可以看到我们想要的效果了。下面是输出结果的代码
$next = $link [0]['next'];
while ( $next !=0){
print_r ( $arr [ $next ]);
$next = $link [ $next ]['next'];
}
从以上代码中我们不难看出表插入排序的时间复杂度依然是O(n²)
好了,以上就是所有表插入排序的内容,欢迎大家在下面留言共同讨论,共同提高。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
