插入排序:表折半插入

? ? 在前一篇插入排序:表插入中。我們用靜態鏈表的存儲方式。直接插入的策略,構建了一種新的插入排序算法:表插入。

有人可能會想到:相同是靜態鏈表的形式,為什么不使用更高效的折半插入策略呢?這樣的想法真的非常好,假設做到了。顯然是極大的優化。

? ? 我在網上還真看到了相關的內容,大家可搜下《表插入方法的改進》,里面有此想法的介紹。這篇博客就是介紹表插入的還有一種實現:表折半插入。看完一定讓你徹底理解它!

與一般的折半插入相比,有例如以下的幾點變化:

  1. 為了實現折半查找,我們對靜態鏈表的節點類型做了一些變化:加入了一個前驅指針。

    它的意義非常顯然,曾經是high=mid-1,在單向鏈表中我們是做不到的(事實上能夠換種方式做到,只是相對麻煩),于是加入一指向其前驅的指針。構成雙向鏈表,方便進行此操作。

  2. while循環的結束條件,有所不同。這個要細致理解!
其它細節,代碼中有詳解
const int MAX=100;
typedef struct rec
{int data;int pre;   //前驅 int next;  //后繼 
}Rec;
void InsertSort(int a[], int n)  //表折半插入 
{Rec *rec=new Rec[n+1];for(int i=0; i<n; i++){rec[i+1].data=a[i];rec[i+1].next=rec[i+1].pre=0;}rec[0].data=MAX;rec[0].next=rec[0].pre=1;int low,high,mid;int p,k,l;for(int i=2; i<n+1; i++){//依據下面的賦值,我們能夠看出。這里使用的是左閉右閉區間 low=rec[0].next;    //low指向最小的 high=rec[0].pre;    //high指向最大的 l=i-1;      //已有序的元素個數 while(low!=0 && high!=0 && rec[low].data<=rec[high].data)  //循環結束條件得理解,特別是前兩個條件。

準確的是。第一個條件能夠不要 { mid=low; k=1; l/=2; // l>>=2 減半。為下次循環做好準備 while(k<l) //尋找mid位置 { mid=rec[mid].next; k++; } if(rec[i].data<rec[mid].data) high=rec[mid].pre; else low=rec[mid].next; } //插入第i個節點。相似于雙向鏈表的插入 rec[rec[low].pre].next=i; rec[i].pre=rec[low].pre; //加入前驅指針的作用體如今這里 rec[i].next=low; rec[low].pre=i; } //順著next指針方向打印 printf("表折半插入排序后\n"); p=rec[0].next; while(p!=0) { printf("%-4d",rec[p].data); p=rec[p].next; } printf("\n"); }


細致看完代碼,我想大多數人僅僅剩一個問題可能沒明確,那就是while循環的結束條件為什么還得加上low!=0high!=0
為了解釋清楚。我們畫一個圖,圖中正在插入i=2的節點:
初始化后。low,mid,high顯然都指向1,經過下一步rec[i].data與rec[mid].data比較后,不管結果如何,循環都應結束。

可假設

rec[i].data<rec[mid].data,就有high=rec[mid].pre,即high=1.此時顯然有rec[low]<rec[high],也就是說循環還得接著經進行下去。問題就出在這里!講到這里,你應該明確:即使出現low為0,它也會違反第三條件:rec[low].data<=rec[high].data)(由于rec[0]的值域是最大的)。這就是為什么說,第一個條件low!=0能夠去掉。

到此。你應該明確了代碼中全部的凝視。


測試走起啊……

p.s 對rec數組1-n號元素進行重排也是能夠的,做法參照上一篇博客哦,方法一模一樣。

轉載請注明出處,本文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/28635157

若是寫得好。頂一個哦。

代碼就是折騰,越折騰越進步!


專欄文件夾看這里:
  • 數據結構與算法文件夾
  • c指針


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456146.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++編譯報錯:重復定義

http://note.youdao.com/noteshare?idcb2bed862a2daae89775603168f297af轉載于:https://www.cnblogs.com/taiyang-li/p/6637093.html

【機器學習】sklearn實現---歸類為5大類

sklearn實現---歸類為5大類 sklearn.preprocessing.scale()&#xff08;最常用&#xff0c;易受異常值影響&#xff09;sklearn.preprocessing.StandardScaler()sklearn.preprocessing.minmax_scale()&#xff08;一般縮放到[0,1]之間&#xff0c;若新數據集最大最小值范圍有變…

關于安裝deepin+window10雙系統有時沒有聲音的問題

關于安裝deepinwindow10雙系統有時沒有聲音的問題 這個問題小編目前還沒有解決,求大神幫忙! deepin社區官網:深度科技社區 還可以參考一下其他的教程 深粉交流:新手剛剛安裝好DEEPIN&#xff0c;但沒有聲音&#xff0c;怎而解決&#xff1f; 冰封飛飛(云網牛站):在Deepin系統中…

如何讀H.264的標準和代碼

首先&#xff0c;還是要弄清楚編解碼的流程和 H.264 的關鍵技術&#xff0c;看白皮書就知道了&#xff0c;另外 H.264 綜述類的文章和別人的學位論文一般也會講到&#xff1b; 其次&#xff0c;弄清楚代碼的各個函數實現的功能&#xff0c;這個可以看看 JM 代碼里各個函數前面的…

Kafka官方文檔翻譯——實現

IMPLEMENTATION 1. API Design Producer APIs Producer API封裝了底層兩個Producer&#xff1a; kafka.producer.SyncProducerkafka.producer.async.AsyncProducerclass Producer {/* Sends the data, partitioned by key to the topic using either the *//* synchronous or t…

【機器學習】熵、決策樹、隨機森林 總結

一、熵 公式&#xff1a; ?∑i1np(xi)?log2p(xi)-\sum_{i 1}^{n}{p(xi)*log_2p(xi)}?i1∑n?p(xi)?log2?p(xi) ∑i1np(xi)?log21p(xi)\sum_{i1}^{n}p(xi)*log_2\frac{1}{p(xi)}i1∑n?p(xi)?log2?p(xi)1? import numpy as np# 賬號是否真實&#xff1a;3no&#xff…

HDU 4857 逃生(拓撲排序)

拓撲排序 一.定義 對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序&#xff0c;是將G中所有頂點排成一個線性序列&#xff0c;使得圖中任意一對頂點u和v&#xff0c;若<u&#xff0c;v> ∈E(G)&#xff0c;則u在線性序列中出現在v之前。 通常&#xff0c;…

關于deepin系統安裝design compiler的問題解答

關于deepin系統安裝design compiler的問題解答 Design?Compiler是Synopsys綜合軟件的核心產品。它提供約束驅動時序最優化&#xff0c;并支持眾多的設計類型&#xff0c;把設計者的HDL描述綜合成與工藝相關的門級設計&#xff1b;它能夠從速度、面積和功耗等方面來優化組合電…

iOS 數據持久化-- FMDB

一、簡介 1.什么是FMDB FMDB是iOS平臺的SQLite數據庫框架 FMDB以OC的方式封裝了SQLite的C語言API 2.FMDB的優點 使用起來更加面向對象&#xff0c;省去了很多麻煩、冗余的C語言代碼 對比蘋果自帶的Core Data框架&#xff0c;更加輕量級和靈活 提供了多線程安全的數據庫操作方法…

【機器學習】交叉驗證篩選參數K值和weight

交叉驗證 導包 import numpy as npfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import datasets#model_selection &#xff1a;模型選擇 # cross_val_score: 交叉 &#xff0c;validation&#xff1a;驗證&#xff08;測試&#xff09; #交叉驗證 from s…

jqGrid列的統計

$("#List").jqGrid({ url: "${pageContext.request.contextPath}/cbfx/getCbhzList.do", datatype: "json", mtype: GET, colNames:["成本類別","費用","去年同期費用","備注"], colMod…

手機只能簽榮耀!最忠誠代言人胡歌喊你去天貓超品日

在你心中&#xff0c;男神胡歌是什么樣子&#xff1f;“御劍乘風來&#xff0c;除魔天地間。”也許是《仙劍奇俠傳》里飛揚跋扈、青春不羈的俠客李逍遙。“遍識天下英雄路&#xff0c;俯首江左有梅郎。”也許是《瑯铘榜》中才智冠天下&#xff0c;遠在江湖卻名動帝輦的麒麟才子…

歐式距離與曼哈頓距離

歐式距離&#xff0c;其實就是應用勾股定理計算兩個點的直線距離 二維空間的公式 其中&#xff0c; 為點與點之間的歐氏距離&#xff1b;為點到原點的歐氏距離。 三維空間的公式 n維空間的公式 曼哈頓距離&#xff0c;就是表示兩個點在標準坐標系上的絕對軸距之和&#xff1a…

在maven pom.xml中加載不同的properties ,如localhost 和 dev master等jdbc.properties 中的鏈接不一樣...

【參考】&#xff1a;maven pom.xml加載不同properties配置[轉] 首先 看看效果&#xff1a; 點開我們項目中的Maven projects 后&#xff0c;會發現右側 我們profile有個可勾選選項。默認勾選localhost。localhost對應項目啟動后&#xff0c;會加載配置左側localhost文件夾下面…

4.8-全棧Java筆記:包機制

包機制是java中管理類的重要手段。 開發中&#xff0c;我們會遇到大量同名的類&#xff0c;通過包我們很容易對解決類重名的問題&#xff0c;也可以實現對類的有效管理。 包對于類&#xff0c;相當于&#xff0c;文件夾對于文件的作用。package我們通過package實現對類的管理&a…

python安裝以及版本檢測

Windows 安裝 Python 3 目前Python有兩個大版本&#xff0c;分別是 2.X 和 3.X &#xff0c;我們的教程基于最新版本 3.6.1 首先我們需要獲取Python的安裝包&#xff0c;可以從官網獲取&#xff0c;如果你因為沒有VPN工具而無法訪問官網的話&#xff0c;我已經將它放在網盤了&…

【機器學習】梯度下降原理

import numpy as np import matplotlib.pyplot as plt %matplotlib inlinef lambda x :(x-3)**22.5*x-7.5 f2 lambda x :-(x-3)**22.5*x-7.5求解導數 導數為0 取最小值 x np.linspace(-2,5,100) y f(x) plt.plot(x,y)梯度下降求最小值 #導數函數 d lambda x:2*(x-3)*12.…

C語言的面向對象設計-對X264/FFMPEG架構探討

本文貢獻給ZSVC開源社區&#xff08;https://sourceforge.net/projects/zsvc/&#xff09;&#xff0c;他們是來自于中國各高校的年輕學子&#xff0c;是滿懷激情與夢想的人&#xff0c;他們將用自己的勤勞與智慧在世界開源軟件領域為中國留下腳步&#xff0c;該社區提供大量視…

linux gtest安裝

1. 安裝cmake, 具體步驟這里不詳說。 2. 下載源碼&#xff1a;https://codeload.github.com/google/googletest/zip/release-1.8.0 3. 解壓源碼&#xff1a;unzip googletest-release-1.8.0.zip 4. 進入源碼目錄&#xff1a;cd googletest-release-1.8.0 5. 創建并進入目錄buil…

基于物聯網的智能垃圾桶設計

前言 目前我國各城市包括首都正在深入開展爭創國家衛生城市活動&#xff0c;這是全國愛國衛生運動委員會辦公室評選命名的國家級衛生優秀城市的最高榮譽&#xff0c;是一個城市綜合素質的重要標志。沈陽市正在深入開展創建國家衛生城市和建設國家健康城市(以下簡稱“雙城雙創”…