《資料結構與演算法 排序》

2021-10-21 14:02:20 字數 3438 閱讀 3700

1 快速排序

1.記錄:排序中的結點

2.檔案:一系列結點構成的線性表

3.排序又稱分類

4.排序碼:結點中乙個或者多個字段,其值作為排序運算中的根據。

基本思想:每次選擇待排序的記錄序列的第1個記錄,按照排序碼的大小將其插入到已排序的記錄序列的適當位置,直到所有記錄全部排序完畢。

最簡單的排序方法。整個排序過程:先將第1個記錄視為乙個有序的記錄序列,然後從第2個記錄開始,依次將未排序的記錄插入到這個有序的記錄序列中,直到整個檔案中的全部記錄排序完畢。在排序過程中,前面的記錄序列是已經排好序的,後面的序列就是待排序處理。

例:假設有5個元素構成的陣列,其排序碼依此是50、20、40、75、35,整個陣列完成直接插入排序的過程如下:

下面是演算法實現

// 直接插入排序

void

directinsertsort

(forsort a,

int n)

a[j]

=temp;

}}

直接插入排序不需要交換,只需要比較。按比較次數,演算法時間複雜度為o(n

2)o(n^)

o(n2).

最好的情況是排序是好的,每次只需要比較一次,演算法時間複雜度為o(n

)o(n)

o(n)

.最壞的情況下是待排序檔案的記錄是按非遞增增序排序,第i趟需要比較i次,演算法的時間複雜度o(n

2)o(n^)

o(n2).

直接插入排序是穩定的。

折半插入排序:在處理a[i]時,a[0],a[1],…,a[i-1]已經排好序。所謂的折半比較就是在插入a[i]時,取a[⌊

i−12

⌋]a[\left \lfloor \frac \right \rfloor]

a[⌊2i−

1​⌋]

的排序碼與a[i]進行比較。如果a[i]的排序碼小於a[⌊

i−12

⌋]a[\left \lfloor \frac \right \rfloor]

a[⌊2i−

1​⌋]

的排序碼,說明a[i]只能插入到a[0]和a[⌊

i−12

⌋]a[\left \lfloor \frac \right \rfloor]

a[⌊2i−

1​⌋]

之間,故可以在a[0]和a[⌊

i−12

⌋]a[\left \lfloor \frac \right \rfloor]

a[⌊2i−

1​⌋]

之間繼續使用折半比較;否則,a[i]只能插入到a[⌊

i−12

⌋]a[\left \lfloor \frac \right \rfloor]

a[⌊2i−

1​⌋]

和a[i-1]之間,故可以在a[⌊

i−12

⌋]a[\left \lfloor \frac \right \rfloor]

a[⌊2i−

1​⌋]

和a[i-1]之間繼續使用折半比較。如此反覆,直到最後能夠確定插入的位置為止。

在上述例子前4個記錄已經排序的基礎上,採用折半插入排序的過程如下:

下面是演算法實現

void

binaryinsertionsort

(forsort a,

int n)

/*找到插入位置為k,先將a[k]-a[i-1]右移乙個位置*/

for(r=i;r>k;r--

) a[r]

=a[r-1]

; a[k]

=temp;

/*將temp插入*/

}}

快速排序演算法又稱分割槽交換排序演算法,該排序演算法使用分割法對排序中的記錄進行排序。

快速排序演算法的排序處理過程如下:從待排序記錄中任選一記錄,以這個記錄的排序碼為中心值,將其他所有記錄劃分為兩部分第1部分包括所有排序碼小於等於中心值的記錄,第2部分包括所有排序碼大於中心值的記錄,而其排序碼作為中心值得這個記錄,在排序後必然處在這兩部分的中間位置;對上述兩部分的繼續採用同樣的方式進行排序處理,直到每個部分為空或者只含有乙個記錄為止。至此,待排序檔案中的每個記錄都被放到正確的排序位置。

舉例:設某檔案中待排序記錄的排序碼分別為28、13、72、85、39、41、6、20。用快速排序法對該檔案進行拍排序,第一趟排序的結果如下:

排序過程採用從兩邊向中間夾入的方法進行分組處理:

第一趟排序的處理結果:20 13 62839 41 85 72

中心值將其他所有記錄分成兩部分,第1部分是中心值記錄前端的部分,包括3個記錄,其排序碼均小於等於中心值;第2部分是中心值後端的部分,包括4個記錄,其排序碼均大於中心值。

對於上述兩部分採用同樣的方法進行處理直到所有記錄排好序。可以看出,快速排序是乙個遞迴演算法

下面是演算法實現

// 用快速排序法對檔案中的一組記錄a[low]....a[high]進行排序

void

quicksort

(forsort a,

int low,

int high)

//找到中心值對應的記錄所在的位置,寫入中心值對應的記錄

a[i]

=temp;

//遞迴處理其他兩部分

quicksort

(a,low,

--j)

;quicksort

(a,++i,high)

;}

資料結構與演算法 排序

排序原理 1.比較相鄰的元素。如果前乙個元素比後乙個元素大,就交換這兩個元素的位置。2.對每一對相鄰元素做同樣的工作,從開始第一對元素到結尾的最後一對元素。最終最後位置的元素就是最大 值。氣泡排序的 實現 public static void sortpop int arr 測試 public st...

演算法與資料結構 排序

void x sort elementtype a,int n 預設討論從小到大的整數排序void bubble sort elementtype a,int n if flag 0 break 無交換則退出 void insert sort elementtype a,int n a i tmp ...

資料結構與演算法 排序演算法

帶問題思考以下幾點 1 每個演算法的思想是什麼?2 每個演算法的穩定性怎樣?時間複雜度是多少?3 在什麼情況下,演算法出現最好情況 or 最壞情況?4 每種演算法的具體實現又是怎樣的?n每次選擇乙個元素k插入到之前已排好序的部分a 1 i 中,插入過程中k依次由後向前與a 1 i 中的元素進行比較。...