資料結構學習筆記 排序技術

2021-06-22 05:45:51 字數 1947 閱讀 9647

1.互換類排序

氣泡排序,複雜度為o(n^2)

void bubblesort(int *a, int n)//考慮氣泡的樣子

}

快速排序,複雜度為o(nlogn)

思想:從線性表中選取乙個元素,設為t(樞軸)。然後對線性表進行分割使得t之前的元素都不大於t,t之後的元素都不小於t,隨後對由t分割的前後兩部分再按上述原則進行分割,不能再分的時候,此時整個線性表就成為了乙個有序表。

從快速排序的思想中我們能夠容易想到,其實現方式應該採用遞迴方式,而快速排序的重點就在於如何實現對線性表的分割。

分割的具體做法是:

(需要說明:這裡我們採用陣列來儲存無序表,且無序表是從1號元素開始向後儲存,即如果無序表元素個數為n-1,則用a[n]來儲存此無序表)

附設兩個指標low和high,它們分別指向無序表的1號元素和n號元素,(0號元素用來儲存樞軸記錄),設定樞軸記錄的關鍵字為pivotkey,則首先從high所指位置起向前搜尋找到第乙個關鍵字小於pivotkey的記錄,這時將high所指向的元素移到pivotkey的位置上,接著從low所指位置起向後搜尋找到第乙個關鍵字大於pivotkey的記錄,這時將low所指向的元素移到pivotkey的位置上,重複上述過程直到low==high。

另外:樞軸記錄的選取可以任意這裡我們將選取「三者取中」的值作為樞軸。(樞軸記錄的選取對演算法的時間複雜度是有影響的,當選取的樞軸記錄是無序表首元素、中間元素、尾元素三者中關鍵字為中間的元素時(「三者取中」)可以改善演算法在最壞情況下的效能。)

下面給出**:

#include

int quicksort(int *, int, int);

void middle(int *, int, int);

void qsort(int *, int, int);

void swap(int &a, int &b);

void swap(int &a, int &b)

void middle(int *a, int low, int high)//對a[low],a[high],a[(low+high)/2]三者進行比較,並將三者中的中間值與a[low]進行互換

}int main(void)

;//a[0]不儲存資料,因此無序表的長度為10

insertsort(a,10);

for(i=1;i<=10;++i)

printf("%d ",a[i]);

return 0;

}

此**實現類似於上面的快速排序,也是使用的陣列a[n]來儲存無序表,且a[0]不存放資料,當做哨兵。

另外的一種寫法是:

#include

void insertsort(int *, int);

void insertsort(int *arr, int len)

arr[j+1] = key;

}}int main(void)

; insertsort(arr,10);

for(i=0;i<=9;++i)

printf("%d ",arr[i]);

return 0;

}

該寫法出自:

希爾排序:時間複雜度為o(n^(3/2))

思想:先將整個待排記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行一次直接插入排序。(使序列基本有序的目的:希爾排序是在插入排序的基礎上先對原始序列進行初步的排序,使其基本有序,而當序列基本有序時插入排序的效率會提高。)

希爾排序特點:子串行的構成不是簡單地「逐段分割」,而是將相隔某個「增量」的記錄組成乙個子串行。

**仍可參見上面的那篇博文,文中說的很詳細。

注意:增量最終需要為1,即對所有記錄進行一次排序。

另外這篇博文也有講希爾排序:

資料結構學習筆記 排序

排序 就是要整理表中的元素,使之按關鍵字遞增 或遞減 有序排列。如果待排序的表中,存在有多個關鍵字相同的元素,經過排序後這些具有相同關鍵字的元素之間的相對 次序保持不變,則稱這種 排序演算法是穩定的。在排序過程中,若整個表都是放在記憶體中處理,排序時不涉及資料的內 外存交換,則稱之為 內排序 反之,...

資料結構學習筆記 快速排序

今天花了一上午的時間終於明白快速排序的原理了,這裡和大家分享一下。比如有一串數字 52684 37,我們通過快速排序先找出第乙個數字 5 在這一串數字中的位置,然後再對數字 5 兩邊的數字進行同樣的排序方法,最終將整串數字排序完畢。找到第乙個數字 5 的具體步驟如下 從這串數字的兩頭出發,把第乙個數...

資料結構學習筆記 堆排序

堆是一棵完全二叉樹。每個結點的值都大於等於該結點的孩子結點的堆稱為大頂堆,反之則稱為小頂堆。為了使用簡便,我們就用陣列heap來儲存堆結構,heap 1 儲存堆的根結點,如果當前遍歷的結點為heap i 則heap 2i 和heap 2i 1 分別為其左右孩子結點。在了解了堆結構定義之後,我們就可以...