Html5 快速排序演示

来源:http://www.cnblogs.com/hsiang/archive/2016/12/23/6216207.html
-Advertisement-
Play Games

快速排序(Quicksort)是對冒泡排序的一種改進。快速排序由C. A. R. Hoare在1962年提出。 它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以 ...


快速排序(Quicksort)是對冒泡排序的一種改進。快速排序由C. A. R. Hoare在1962年提出。
  • 它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列
  • 快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。
  • 每次儘可能地選擇一個能夠代表中值的元素作為關鍵數據,然後遵循普通快排的原則進行比較、替換和遞歸。
  • 快速排序的平均運行時間為O(nlogn)。

-----------------------------------------------------------------------------------------------------------------------------------------

演示如下圖所示:

演算法原理不再贅述,具體代碼如下:

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4     <title>The twelve html page</title>
  5 <style type="text/css">
  6         ul li
  7         {
  8             list-style-type:georgian;
  9             text-align:left;
 10          }
 11         .mark
 12         {
 13             width:180px;
 14             height:40px;
 15             color:Olive;
 16             text-align:center;
 17             line-height:40px;
 18             margin:5px;
 19             float:left;
 20          }
 21           .redball
 22         {
 23             width:40px;
 24             height:40px;
 25             border-radius:20px;
 26             background-color:Red;
 27             text-align:center;
 28             line-height:40px;
 29             margin:5px;
 30             float:left;
 31         }
 32         .ball
 33         {
 34             width:40px;
 35             height:40px;
 36             border-radius:20px;
 37             background-color:Aqua;
 38             text-align:center;
 39             line-height:40px;
 40             margin:5px;
 41             float:left;
 42         }
 43         .line
 44         {
 45             clear:left;
 46          }
 47         header
 48         {
 49             height:80px;
 50             border:1px solid gray;
 51         }
 52         .left
 53         {
 54             border:1px solid gray;
 55             float:left;
 56             width:30%;
 57             height:480px;
 58             margin-left:0px;
 59             margin-right:0px;
 60             
 61         }
 62         aside
 63         {
 64             text-align:center;
 65         }
 66         section
 67         {
 68             width:69.5%;
 69             float:left;
 70             height:480px;
 71             border:1px solid gray;
 72             margin-left:0px;
 73             margin-right:0px;
 74         }
 75         footer
 76         {
 77             clear:left;
 78             height:60px;
 79             border:1px solid gray;
 80         }
 81         input[type="button"]
 82         {
 83             width:80px;
 84             text-align:center;
 85             margin-top:10px;
 86          }
 87     </style>
 88     <script type="text/javascript">
 89         function initDiv() {
 90             var mainArea = document.getElementById("mainArea");
 91             for (var i = 0; i < 8; i++) {
 92                 var newDivLine = document.createElement("div");
 93                 newDivLine.setAttribute("class", "line");
 94                 mainArea.appendChild(newDivLine);
 95                 for (var j = 0; j < 9; j++) {
 96                     var newDiv = document.createElement("div");
 97                     var id = i.toString() + j.toString();
 98                     newDiv.setAttribute("id", id);
 99                     if (j < 8) {
100                         newDiv.setAttribute("class", "ball");
101                     } else {
102                         newDiv.setAttribute("class", "mark");
103                     }
104                     newDivLine.appendChild(newDiv);
105                 }
106             }
107         }
108         
109         function setElementsValue() {
110             var arrTmp = [4, 6, 8, 7, 9, 2, 10, 1];//初始元素賦值
111             for (var i = 0; i < arrTmp.length; i++) {
112                 document.getElementById("0" + i.toString()).innerText = arrTmp[i];
113             }
114             document.getElementById("08").innerText = "原始數據";
115         }
116         var m = 0; //表示第幾趟排序
117         //快速排序
118         function setQuickSortValue() {
119             m = 0;
120             var arrTmp = [4, 6, 8, 7, 9, 2, 10, 1];
121             QuickSort(arrTmp,0,arrTmp.length-1);
122         }
123         function QuickSort(arrTmp, low, high) {
124             if (low >= high) {
125                 return;
126             }
127             //完成一次單元排序
128             var index = QuickSortUnit(arrTmp, low, high);
129             
130             //對左邊進行排序
131             QuickSort(arrTmp, low, index - 1);
132             //對右邊進行排序
133             QuickSort(arrTmp, index + 1, high);
134         }
135 
136         //快速排序單元
137         function QuickSortUnit(arrTmp, low, high) {
138             var key = arrTmp[low];
139             while (low < high) {
140                 //從後向前搜索比key小的值
141                 while (arrTmp[high] >= key && high > low) {
142                     --high;
143                 }
144                 //比key小的放左邊
145                 arrTmp[low] = arrTmp[high];
146                 while (arrTmp[low] <= key && high > low) {
147                     ++low;
148                 }
149                 arrTmp[high] = arrTmp[low];
150             }
151             arrTmp[low] = key;
152             m = m + 1;
153             ShowHtml(arrTmp, m, high);
154             return high;
155         }
156 
157         //m表示第幾趟排序,index表示分組的分界線
158         function ShowHtml(arrTmp,m,index) {
159             //顯示出來
160             for (var k = 0; k < arrTmp.length; k++) {
161                 document.getElementById((m).toString() + k.toString()).innerText = arrTmp[k];
162                 if (index == k) {
163                     document.getElementById((m).toString() + (k).toString()).setAttribute("class", "redball");
164                 }
165             }
166             document.getElementById((m).toString() + "8").innerText += "" + (m).toString() + " 趟排序(index="+index+")";
167         }
168 
169     </script>
170 </head>
171 <body>
172 <header>
173     <h1>快速排序(Quick Sort)Demo</h1>
174 </header>
175 <aside class="left">
176 
177 <input type="button" id="btnInit" value="Init" onclick="initDiv();" />
178 <br />
179 <input type="button" id="btnSetValue" value="SetValue" onclick="setElementsValue();" />
180 <br />
181 <input type="button" id="btnSort" value="Quick Sort" onclick="setQuickSortValue();" />
182 <br />
183 <h3>快速排序(Quick Sort)</h3>
184 <ul>
185     <li>快速排序(Quicksort)是對冒泡排序的一種改進。<mark>交換排序</mark></li>
186     <li>快速排序是<mark>非穩定</mark>排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。</li>
187     <li>基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以<mark>遞歸</mark>進行,以此達到整個數據變成有序序列。</li>
188     <li>設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作為關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。</li>
189     <li>快速排序的平均運行時間為O(nlogn)。</li>
190 </ul>
191 </aside>
192 <section id="mainArea">
193     
194 </section>
195 <footer>
196     這是底部信息
197 </footer>
198 </body>
199 </html>
View Code

 快速排序演算法,優化方案:

  1. 三平均分區法,將待排序的數據分為前,中,後 三個區
  2. 根據分區大小調整演算法,因為快速排序演算法對於數據較少時並沒有優勢
  3. 並行的分區快速排序,由於快速排序演算法是採用分治技術來進行實現的,這就使得它很容易能夠在多台處理機上並行處理。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • StringBuffer 線程安全的可變字元序列。 StringBuffer源碼分析(JDK1.6): public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, Cha ...
  • ·核心作用: -保證一個類只有一個實例,並且提供一個訪問該實例的全局訪問點。 ·常見應用場景: -Windows的Task Manager(任務管理器)就是很典型的單例模式 -Windows的Recycle Bin(回收站)也是很典型的單例應用。在整個系統運行過程中,回收站一直維護著僅有的一個實例 ...
  • 創建型模式:-單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式結構型模式:-適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式行為型模式:-模板方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態模式、策略模式、職責鏈模式、訪問者模式 ...
  • 關於Prometheus Prometheus是一套開源的監控系統,它將所有信息都存儲為時間序列數據;因此實現一種Profiling監控方式,實時分析系統運行的狀態、執行時間、調用次數等,以找到系統的熱點,為性能優化提供依據。 監控方式 程式代碼收集運行數據寫入到redis,通過API介面開放給Pr ...
  • 一、緣起 分散式環境下,多台機器上多個進程對一個數據進行操作,如果不做互斥,就有可能出現“餘額扣成負數”,或者“商品超賣”的情況,如何實現簡易分散式鎖,對分散式環境下的臨界資源做互斥,是今天將要討論的話題。 二、互斥原理 原理:多個訪問方對同一個資源進行操作,需要進行互斥,通常是利用一個這些訪問方同 ...
  • 前面的話   一個完整的HTML文檔必須包含3個部分:文檔聲明、文檔頭部和文檔主體。而正是它們構成了HTML的骨架結構。前面已經分別介紹過文檔聲明和文檔頭部,本文將詳細介紹構成HTML骨架結構的基礎元素   HTML    與``標簽限定了文檔的開始 ...
  • 這是React井字棋項目的最後一篇筆記,記述AI實現。 一. 是開頭都會說的原理 但凡懂一點圍棋的人都知道“大場”這個概念,可以淺顯地把它理解為佈局時棋盤上各處的要點。棋諺“金角銀邊草肚皮”,就很好地說明瞭大場具有的特征:價值高。 比如沒其他子的情況下,先手占星角位,這手棋價值大約是20目。第一手下 ...
  • display:box 使子元素成行排列如果父級寬度小於子級盒子 不會把超出部分擠出下麵 而是直接超出 -box-orient:vertical 使盒子垂直顯示 預設水平顯示 -box-direction:Reverse使盒子排列順序顛倒; -box-ordinal-group: ;設置元素排列的具 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...