藍橋杯 冒泡 快排 雜湊排(筆記系列2)

2021-10-14 08:04:46 字數 2157 閱讀 9893

對於此題以下分三種排序演算法來解決

氣泡排序:

先講一下什麼叫氣泡排序法。

現給乙個有10個有效資料的陣列a[11](從下標1開始到10),按照上面題目的意思,進行從小到大的順序進行排序,再倒序輸出(當然也可以從大到小順序輸出)。從第乙個數開始,對它接下來的每乙個數進行比較,如果它的後乙個數比前乙個數小,則交換,交換到最後則最後乙個數必定是當前陣列中最大的數。那麼第二次進行比較的時候,由於最後乙個數字已經確定是最大的,所以比較的次數應該減去1。那麼一共有n個數,所以總共的大迴圈是n-1,也就是一共要對n-1個數字進行冒泡。

這裡的疑惑在於:為什麼是n-1的大迴圈

這裡要注意的是,因為冒泡是兩兩相比,所以如果是n的迴圈,則n與n+1這組數無法比較。如果這時陣列不大還存在資料溢位情況。

那麼大迴圈確定以後就是小迴圈,這個小迴圈怎麼得?回到最開始的兩兩比較。假設現在處理第乙個數,那麼進行兩兩相比的時候,最後確定的數是當前陣列最大(或最小)的數,這個數原來不一定是陣列的第乙個數,也不一定是最後乙個數,所以通過兩兩相比,把大的換到後面,小的放到前面,兩個兩個一組進行比較,這樣就確定了最後乙個數,那麼小迴圈第一次就也是n-1。但如果是確定第二個數呢,此時陣列的最後乙個數已經確定,那麼小迴圈不需要到n-1,只需要到n-2即可,這裡發現n減去乙個變數,這個變數就是要確定的第幾個數。所以,小迴圈的終止條件是≤n-i。

講了這麼多總結一下:氣泡排序就是通過兩兩相比的方式,來逐步確定乙個陣列的最大值或最小值,也就是說氣泡排序法只能實現從大到小排序或者從小到大排序。當然也可以實現一半從大到小,一半從小到大,這個是雙重的氣泡排序,多了乙個分治的過程。這個可以不考慮。

下面來看詳細**:

關於時間複雜度與效率的分析:

快速排序:

快速排序在c++的api文件中有個sort庫函式,這個庫函式是乙個改良版的快排,也稱之為內省式排序。這個庫函式的用法如下

sort(a+1,a+n+1),a是乙個陣列,這裡採用指標的方式,排序a[1]~a[n]的資料。預設是公升序

關於快速排序:

雜湊排序:

這裡解釋為什麼是50,000加上t,因為題目中整數的區間最小是-50,000,且每個數字都各不相同,所以是50,000加上變數t,t的最小值是-50,000。因為陣列不存在負的位置,所以只好把負的變成正的,就整體向右移50000,那麼就變成了上面所寫。

雜湊排序:

把排序的數值放到乙個新的陣列裡面,排序的數值就是新陣列的下標。如果排序的數值存在,則對應新陣列的值為1,否則為0。

現在分三種情況處理:①如果排序的數值都是正數,則新陣列的大小必須大於數值,同時下標就是排序的數值。②如果排序的數都是負數,則需要加上排序的數值的最小值的絕對值作為固定值。同時下標要減去乙個變數i,這個變數i其實就是排序的數值。③如果排序的數值正負數都有,這種情況和第二種情況類似,只不過在輸出的時候要根據排序的數值的取值區間來判斷這個固定值的取值,其餘和第二種情況類似。

雜湊排序和桶排序很像,但是又有點不同

最基本的桶排序參考:

氣泡排序和快排

1.氣泡排序 氣泡排序要點 1 兩層迴圈,外層迴圈控制走訪數列重複進行的次數,內層迴圈進行資料的比較 交換,是資料 上浮 2 內層迴圈是相鄰的資料進行比較。var bubblesort function arr console.log arr 1,1,2,3,4,6,7,8 bubblesort 1...

排序演算法(快排,冒泡)

排序目的 快速查詢 排序演算法優劣的判斷條件 1.時間複雜度 2.空間複雜度 3.穩定性 關鍵字值相等的數字們,排完序之後順序不變 十大排序演算法 需要掌握的的 氣泡排序 快速排序 希爾排序 折半插入排序 堆排序 氣泡排序 依次比較第i個數與第i 1個數的大小,如果符合條件則不變,如果不符合條件,兩...

排序 選擇 冒泡 快排

簡單介紹三種常見的排序方法 選擇 冒泡 快排。從大到小排列 選擇排序是在所有資料中先選擇第乙個資料作為最大值,依次和後面的每乙個資料比較,如果比最大值大,替換最大值並且記住索引,遍歷結束後,通過索引把最大值和第乙個資料替換。後面的資料依次執行一遍,就可以得到從大到小排列的資料了。如下 4 void ...