日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些?

發(fā)布時間:2024/2/28 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

先說結(jié)論

比較次數(shù) 與序列初態(tài) 無關(guān) 的算法是:二路歸并排序、簡單選擇排序、基數(shù)排序
比較次數(shù) 與序列初態(tài) 有關(guān) 的算法是:快速排序、直接插入排序、冒泡排序、堆排序、希爾排序

排序趟數(shù) 與序列初態(tài) 無關(guān) 的算法是:直接插入排序、折半插入排序、希爾排序、簡單選擇排序、歸并排序、基數(shù)排序
排序趟數(shù) 與序列初態(tài) 有關(guān) 的算法是:冒泡排序、快速排序


關(guān)于排序趟數(shù)

插入排序、選擇排序 趟數(shù)都是固定的 n-1。對于插入排序來說,即使序列有序,也要依次從第二個元素開始,向前找它的插入位置。

冒泡排序 趟數(shù)與數(shù)據(jù)有關(guān),優(yōu)化冒泡排序的最優(yōu)復雜度為O(n),其主要優(yōu)化就是記錄了前一趟是否冒泡,如果沒有產(chǎn)生冒泡就說明數(shù)組已經(jīng)有序,直接return。如果產(chǎn)生了冒泡,才繼續(xù)執(zhí)行。

快速排序 的排序趟數(shù)就是它的遞歸深度。當 快排 的數(shù)據(jù)是有序時候,會退化為冒泡,所以快排趟數(shù)也與初始序列順序有關(guān)了。如下圖:


關(guān)于比較次數(shù)

有同學在評論中提出了疑問,我在這里補充一下吧,關(guān)于對于比較次數(shù)和初始狀態(tài)的關(guān)系的理解
堆排序:比如元素下沉的操作,雖然一個元素是從底部拉上來的,但這不代表這個元素一定會接著沉到底部,如果沉到中間就停止下沉的話,比較次數(shù)就少了。而這個過程的比較次數(shù)自然和下沉的深度是相關(guān)的。
希爾排序:希爾排序是對簡單插入排序的改進,每一趟希爾的內(nèi)部使用的就是簡單插入排序。而簡單插入排序隨著數(shù)據(jù)變成正序時,執(zhí)行效率最好,每次插入都不用移動前面的元素,時間復雜度為O(N)。當數(shù)據(jù)是反序時,執(zhí)行效率最差,此時時間復雜度為O(N*N). 類比到希爾排序中,希爾排序本身就是屬于插入排序。當然會隨著有序而少比較幾次。
(這里說的比較次數(shù)是精確的次數(shù),區(qū)別于時間復雜度的概念,時間復雜度只是描述了數(shù)量級)

選擇排序

i 從頭開始,每次遍歷之后所有的元素,k 從 i 開始,向后標記 選出 最小的元素,循環(huán)后如果大于 i ,則與 i 位置元素 交換,一直到最后。
簡單選擇排序它最大的特點是,交換移動數(shù)據(jù)次數(shù)相當少,這樣也就節(jié)約了相應(yīng)的時間,無論最好最壞的情況,其比較次數(shù)都是一樣多。第 i 次排序需要進行n-i 次關(guān)鍵字的比較,此時需要比較n-1+n-2+…+1=n(n-1)/2次,所以 總比較次數(shù) 與初始狀態(tài) 無關(guān),時間復雜度為O(n^2)。

對于交換次數(shù)而言,最差的時候,也就初始排序,交換次數(shù)為n-1次,復雜度為O(n)。當全部已經(jīng)排序好時,則不發(fā)生交換,所以 元素總移動次數(shù) 與初始狀態(tài) 有關(guān)

直接插入排序

從當前關(guān)鍵字之前的關(guān)鍵字開始掃描,如果大于待排關(guān)鍵字,則后移一位。直到全部記錄插入完成。

如果全部有序,則只需要遍歷一趟就完成了排序,比較次數(shù)為 n-1,并且在這個過程中沒有發(fā)生元素的移動。因此,比較次數(shù) 與序列初態(tài) 有關(guān) 。初始序列基本有序時,移動元素最少(效率最高)。

void insertSort(int A[],int n) {int i, j, temp;for (i = 1; i < n; i++) { // 將各元素插入已經(jīng)排好的序列中if (A[i] < A[i - 1]) { // 若A[i]關(guān)鍵字小于前驅(qū)temp = A[i]; // 用 temp 暫存 A[i]for (j = i - 1; j >= 0 && A[j] > temp; --j) // 檢查所有前面已經(jīng)排好序的元素A[j + 1] = A[j]; // 將所有大于 temp 的元素右移一個位置A[j + 1] = temp; // 復制到插入位置}} }

若使用 折半插入 來進行優(yōu)化,雖然減少了元素的比較次數(shù),但并未使時間復雜度脫離O(n^2)


關(guān)于算法復雜度與序列初態(tài)的關(guān)系

算法復雜度 與初始狀態(tài) 無關(guān) 的有哪些?

首先看內(nèi)排序總結(jié)表:


由表中紅線標出的地方可以輕易得出,以下四種排序方法的算法復雜度與數(shù)組的初始狀態(tài)無關(guān)

一堆(堆排序)烏龜(歸并排序)選(選擇排序)基(基數(shù)排序)友。

總結(jié)

以上是生活随笔為你收集整理的数据结构:排序趟数 / 比较次数与序列的原始状态有关的排序方法有哪些?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。