天天看點

軟體設計師--資料結構複習(排序)案例及相關知識直接插入排序希爾排序冒泡排序歸并排序簡單選擇排序快速排序堆排序基數排序

軟體設計師--資料結構複習(排序)案例及相關知識

  • 直接插入排序
  • 希爾排序
  • 冒泡排序
  • 歸并排序
  • 簡單選擇排序
  • 快速排序
  • 堆排序
  • 基數排序

直接插入排序

一種簡單的排序方法

具體做法是:再插入第i個記錄時,R1,R2…Ri-1已經排好序,這時将關鍵字ki與關鍵字ki-1,ki-2進行比較進而找到位置插入

案例:

<3,1,4,1,5,9,6,5> 
原元素序列:監視哨(3)1,4,1,5,9,6,5
一、3 (1,3),4,1,5,9,6,5		插入時與1進行比較一次
二、4(1,3,4)1,5,9,6,5		插入時與3進行比較一次
三、1(1,1,3,4)5,9,6,5		插入時與1,3,4進行比較三次
四、5(1,1,3,4,5)9,6,5		插入時與4進行比較一次
五、9(1,1,3,4,5,9)6,5		插入時與5進行比較一次
六、6(1,1,3,4,5,6,9)5		插入時與5,9進行比較兩次
七、5(1,1,3,4,5,5,6,9)		插入時與5,6,9進行比較三次
	共比較12次
           

希爾排序

又稱“縮小增量排序”,是直接插入排序的改進

做法:

将記錄序列分割成若幹子列,然後分别進行直接插入排序。

< 3,1,4,1,5,9,6,5>  從小到大
k增量設為:4,2,1(自定,一般為n/2)即移動要比較的位置 例如:k=2,i = 1,則比較位置為 3.
一、 3,1,4,1,5,9,6,5 均 a<b無需移動 k =4
二、3,1,4,1,5,5,6,9 移動5和9 k = 2
三、1,1,3,4,5,5,6,9 插入排序 k = 1
           

冒泡排序

做法:

首先将第一個記錄的關鍵字和第二個記錄的關鍵字進行比較,若為逆序(a>b),則交換這兩個記錄的值,然後比較第二個和第三個記錄的關鍵字,直至n-1個記錄與n個記錄比較過為止。

冒泡排序可以從前往後(1-2,2-3),也可以從後往前(n-(n-1),((n-1)-(n-2)))

<3,1,4,1,5,9,6,5> 從小到大
第一遍排序結果
1,3,4,1,5,9,6,5
1,3,4,1,5,9,6,5
1,3,1,4,5,9,6,5
1,3,1,4,5,9,6,5
1,3,1,4,5,9,6,5
1,3,1,4,5,6,9,5
1,3,1,4,5,6,5,9
第一遍結束的标志為關鍵字最大記錄交換到第n的位置
随即開始第二趟冒泡排序,最大關鍵字交換到n-1的位置
           

歸并排序

做法:

是将兩個或兩個以上的有序檔案合并為一個新的有序檔案。

< 3,1,4,1,5,9,6,5> 
一、[1,3],[1,4],[5,9],[5,6] 	比較四次
二、[1,1,3,4],[5,5,6,9]		前半部分比較三次,後半部分比較三次
三、[1,1,3,4,5,5,6,9]		5 分别與前半部分比較一次
共比較12次
           

簡單選擇排序

做法:

通過n-i(1<=i<=n)在次關鍵字之間比較,從n-i+1個記錄中選出最小的記錄,并和第i個記錄交換,當i等于n時所有記錄有序排序。

即 3 和[1,4,1,5,9,6,5]中最小的進行交換 -1.

< 3,1,4,1,5,9,6,5>  從小到大
一、1,3,4,1,5,9,6,5  	1-3交換
二、1,1,4,3,5,9,6,5	1-3交換
三、1,1,3,4,5,9,6,5	3-4交換
四、1,1,3,4,5,5,6,9	5-9交換
	中間省略不交換循環
           

快速排序

做法:

通過一趟排序将待排序的記錄劃分為兩部分,稱為前半區和後半區,前半區中的記錄均不大于後半區的關鍵字,然後分别繼續進行快速排序,進而有序。

當i,j相等時結束排序。i,j 初始為第一個和最後一個記錄。樞軸記錄一般為第一個關鍵字的值。

< 3,1,4,1,2,9,6,5>  從小到大,標明3為樞軸即pivot
一、從右往左找到小于pivot的值
二、從左往右找到大于pviot的值
三、當都停止移動時,交換i,j的值
四、随即按照以上步驟繼續移動,直至i=j,停止檢索,将pivot的值和i=j的位置的值交換。
第一輪結束:pivot的左邊均比pivot小,右邊均比pivot大。
随後遞歸進行。
 3,1,4,1,2,9,6,5
 一、 3,1,2,1,4,9,6,5		i=2,j=4
 二、i=j=3,交換位置得 1,1,2,3,4,9,6,5	第一輪結束。
 三、重複以上步驟直至完成排序。
           

堆排序

什麼是堆:

1.必須是完全二叉樹

2.父節點的值必須大于子節點

堆的相關知識:https://www.bilibili.com/video/av47196993?from=search&seid=16388479098851201312

具體堆排序在24分鐘,但是建議看完所有視訊,講的不錯

堆排序實作:

首先滿足堆的條件,則将根節點和最後一個節點資料交換并将最後一個節點剔除,單獨儲存到數組。

接着進行堆化,讓其滿足根節點為最大值,在将根節點與最後一個節點的值進行交換,剔除最後一個節點,将其加入到之前的數組,重複以上步驟,直至排序完成。

基數排序

類似于隊列,從個位,往上,将個位數值相同的放到一個隊列裡,先進先出,比較的位數按照最大的進行比較即1441,512,12則需從個十百千依次比較,入隊,出隊,其餘位補零即0012,0512.

可視化展示:https://www.bilibili.com/video/av33889058?from=search&seid=7331912349404153369

相關資料算法看:https://blog.csdn.net/qq_25233621/article/details/80993174

繼續閱讀