排序演算法總結

2021-09-24 07:02:19 字數 2411 閱讀 2018

在要排序的一組數中,假設前n-1個數已經拍好順序,現將第n個數插到有序數列中,使這n個數也是排序好的,如此迴圈,直到全部排好順序。o(n^2)

**實現:

void

insertsort

(int array,int length)

else}}

}複製**

在要排序的陣列中,選擇最小(或者最大)的數與第1個位置的數交換。然後在剩下的數中再找最小(或者最大)的數與第2個位置的數交換。以此類推,直到第n-1個元素與第n個元素比較為止。複雜度:o(n^2)

**實現:

void

selectsort

(int arr)

}if(minindex != i)

}}複製**

演算法改進:二元選擇,簡單選擇排序,每趟迴圈只能確定乙個元素排序後的定位。我們可以考慮改進為每趟迴圈確定兩個元素(當前趟最大和最小記錄)的位置,從而減少排序所需的迴圈次數。

兩個數比較大小,較大的數下沉,較小的數冒出。

過程:比較相鄰資料,若第二個數小,就交換位置:從後向前兩兩比較,一直到比較最前兩個資料最終最小資料被交換到起始位置,則第乙個最小數字置排好:重複上述過程,將剩餘數排好。

**實現:

void

bubblesort

(int arr)}}

}複製**

優化:多數時候,資料排好順序後,演算法仍會進行下一輪比較,知道arr.length-1次,後面的比較無意義。此時可設定標誌位flag,用於標誌某一趟排序過程是否有資料交換,若未發生交換,則可立即結束排序。

void

bubblesort

(int arr)

}if(!flag)

break;

}}複製**

改進方案:1.設定一標誌性變數pos。用於記錄每躺排序中最後一次進行交換的位置。由於pos位置之後的記錄均已交換到位,故下一趟排序只要掃到pos位置即可。

void

bubble

(int r)

i = pos; //為下一趟做準備

}}複製**

基本思想

先從數列中取出乙個數作為key值;

將比這個數小的數全部放在它的左邊,大於或等於它的數全部放在它的右邊;

對左右兩個小數列重複第二步,直至各區間只有1個數。

輔助理解:挖坑填數

1.初始時 i = 0; j = 9; key=72

由於已經將a[0]中的數儲存到key中,可以理解成在陣列a[0]上挖了個坑,可以將其它資料填充到這來。

從j開始向前找乙個比key小的數。當j=8,符合條件,a[0] = a[8] ; i++ ; 將a[8]挖出再填到上乙個坑a[0]中。

這樣乙個坑a[0]就被搞定了,但又形成了乙個新坑a[8],這怎麼辦了?簡單,再找數字來填a[8]這個坑。

這次從i開始向後找乙個大於key的數,當i=3,符合條件,a[8] = a[3] ; j-- ; 將a[3]挖出再填到上乙個坑中。

陣列:72   6   57   88   60   42   83   73   48   85

0 1 2 3 4 5 6 7 8 9複製**

2.此時 i = 3; j = 7; key=72

再重複上面的步驟,先從後向前找,再從前向後找。

從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;

從i開始向後找,當i=5時,由於i==j退出。

此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將key填入a[5]。

陣列:48   6   57   88   60   42   83   73   88   85

0 1 2 3 4 5 6 7 8 9複製**

3.可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對a[0…4]和a[6…9]這二個子區間重複上述步驟就可以了。

陣列:48   6   57   42   60   72   83   73   88   85

0 1 2 3 4 5 6 7 8 9複製**

**實現:

void

quicksort

(int a,int l,int r)

複製**

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...