資料結構 七大排序(一)

2021-10-04 06:21:11 字數 3212 閱讀 5037

排序:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。

穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次

序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排

序演算法是穩定的;否則稱為不穩定的。

內部排序:資料元素全部放在記憶體中的排序。

外部排序:資料元素太多不能同時放在記憶體中,根據排序過程的要求不能在內外存之間移動資料的排序。

常見的排序演算法:

排序演算法的實現

直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的記錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中,直到所有的記錄插入完為止,得到乙個新的有序序列 。

**直接插入排序:**當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排序碼與array[i-1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序後移

**實現:

單次遍歷:乙個元素排序比如說a[end]=6,首先先定義乙個tmp來儲存其a[end+1]不儲存則會被覆蓋,然後比較end和tmp的值,若tmp比他大單次迴圈結束,若比他小,則將end的值後移一位(注意將值付給end+1這個位置,若直接賦tmp,則會導致原tmp資料丟失且比較錯誤),但是tmp還要迴圈依次跟前面的值進行比較,進行資料挪動,直到和a[0]比較完結束

多次遍歷:外面在巢狀一層迴圈,遍歷每個數,但是要注意,ivoid

insertsort

(int

* a,

int n)

else

} a[end +1]

= tmp;

}}直接插入排序的特性總結:

元素集合越接近有序,直接插入排序演算法的時間效率越高

時間複雜度:o(n^2)

空間複雜度:o(1),它是一種穩定的排序演算法

穩定性:穩定

希爾排序( 縮小增量排序 )

希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定乙個整數,把待排序檔案中所有記錄分成個

組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和排序的工

作。當到達=1時,所有記錄在統一組內排好序。

**實現

1.首先通過`gap = gap / 3 + 1來進行分組,當gap為1時,是最後一趟。其原理和直接插入排序一樣

void

shellsort

(int

* a,

int n)

else

} a[end + gap]

= tmp;}}

}

希爾排序的特性總結:5. 希爾排序是對直接插入排序的優化。

6. 當gap > 1時都是預排序,目的是讓陣列更接近於有序。當gap == 1時,陣列已經接近有序的了,這樣就

會很快。這樣整體而言,可以達到優化的效果。我們實現後可以進行效能測試的對比。

7. 希爾排序的時間複雜度不好計算,需要進行推導,推導出來平均時間複雜度: o(n1.3—n2)

8. 穩定性:不穩定

基本思想:每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完 。

}堆排序排公升序為建大堆講解:首先建堆,把資料錄入以後向下調整建堆.

首先堆向下調整後,很多人就懵逼了,應該就有序了吧?(假設建大堆只是滿足了上一層比下一層大,但不一定有序)。

大堆排好已接近有序,根節點一定是最大值,我們需要迴圈節點進行排序,首先交換根節點和末尾節點的位置,則最大值在末尾,而根節點為起初的堆尾元素,腿破壞,但左右子樹仍為大堆,則向下調整(末尾節點已經最大無需再調),根據大堆向下調整的規則,堆頂元素一定是最大值和末尾元素交換,次大的值在倒數第二個位置上(下次調整無需再調他了)。以此類推進行向下調整的值裡最大的值會依次取出,最終有序。

**實現:

//堆排序

//公升序建大堆

//堆的初始化

void

adjustdown

(int

* array,

int n,

int parent)

//較大孩子大於雙親,交換

if(array[child]

>array[parent]

)else}}

void

heapsort

(int

* a,

int n)

while

(n >1)

}

資料結構 七大排序演算法總結

面試中,無論是問還是寫,排序被問到的次數總是很多。總結一些八大排序演算法。插入,希爾,選擇,堆 冒泡,快速 歸併 排序方法 初始序列有無影響 最好情況 最壞情況 插入排序 有正序有序這樣只需要比較n次,不需要移動。因此時間複雜度為o n 逆序有序這樣每乙個元素就需要比較n次,共有n個元素,因此實際複...

資料結構和演算法 七大排序演算法實現

七大排序演算法實現 include using namespace std void swap int num1,int num2 1.選擇排序演算法 bool selectionsort int arr,int len if max len i 1 return true 2.氣泡排序演算法 bo...

七大排序演算法

氣泡排序 void bubble int a,int n 選擇排序 void select sort int a,int n n為陣列a的元素個數 將第i 小的數,放在第i 個位置 如果剛好,就不用交換 if i min index 插入排序 typedef int elementtype void...