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 中的元素進行比較。...