大話資料結構讀書筆記6

2021-10-22 16:22:41 字數 4605 閱讀 1583

氣泡排序

通過一次次比較,把小的前移,把最小的排在最前面

氣泡排序的優化:

1、i和j進行比較,位置交換變化大

2、j和j+1進行比較,位置變化小,但沒有對後續的幫助,如前面兩兩直接沒有交換,表面已經有序,但下一輪仍進行判斷

3、在2的基礎上,在兩兩交換的時候加了乙個flag

/* 對順序表l作交換排序(氣泡排序初級版) */

void

bubblesort0

(sqlist *l)}}

}/* 對順序表l作氣泡排序 */

void

bubblesort

(sqlist *l)}}

}/* 對順序表l作改進冒泡演算法 */

void

bubblesort2

(sqlist *l)}}

}

簡單選擇排序
不斷地比較,但不是每次都交換,而是把找到的最小的資料放在最前面(比較一輪,只交換一次)

不交換的前提是有乙個記錄最小資料位置的標量

/* 對順序表l作簡單選擇排序 */

void

selectsort

(sqlist *l)

if(i!=min)

/* 若min不等於i,說明找到最小值,交換 */

swap

(l,i,min)

;/* 交換l->r[i]與l->r[min]的值 */

}}

直接插入排序
如同撲克牌的插入一樣,把乙個資料根據大小插入到已經排好序的集合裡面

把資料給哨兵,位置後移,把資料重新複製插入的位置

/* 對順序表l作直接插入排序 */

void

insertsort

(sqlist *l)

}}

希爾排序
選擇乙個增量值,此位置和加上增量值位置上的資料大小比較,進行插入

縮小增量大小,大小比較,進行交換

增量的選擇關係著演算法的好壞

for(j=i-increment;j>0 && l->r[0]r[j];j-=increment)

​ l->r[j+increment]=l->r[j]; / 記錄後移,查詢插入位置 /

這一句**不只是兩個位置的交換

/* 對順序表l作希爾排序 */

void

shellsort

(sqlist *l)

}printf

(" 第%d趟排序結果: "

,++k)

;print

(*l);}

while

(increment>1)

;}

堆排序
根據完全二叉樹的性質,生成堆,把最大的排到根節點

把根節點與最後乙個交換,對n-1資料的樹結構進行堆的調整,重新獲得剩下資料的最大

運用的二叉樹的知識:

1.大頂堆:每個結點的值都大於等於其左右孩子結點的值

2.小頂堆:每個結點的值都小於等於其左右孩子結點的值

3.i與2i和2i+1的雙親子女關係

/* 堆排序********************************** */

/* 已知l->r[s..m]中記錄的關鍵字除l->r[s]之外均滿足堆的定義, */

/* 本函式調整l->r[s]的關鍵字,使l->r[s..m]成為乙個大頂堆 */

void

heapadjust

(sqlist *l,

int s,

int m)

l->r[s]

=temp;

/* 插入 */

}/* 對順序表l進行堆排序 */

void

heapsort

(sqlist *l)

}

歸併排序
一大組資料分割成小組的資料,再從小組資料進行排序歸併

/* 歸併排序********************************** */

/* 將有序的sr[i..m]和sr[m+1..n]歸併為有序的tr[i..n] */

void

merge

(int sr,

int tr,

int i,

int m,

int n)

if(i<=m)

if(j<=n)

}

遞迴方法:思路簡單,但是使用輔助空間較大

/* 遞迴法 */

/* 將sr[s..t]歸併排序為tr1[s..t] */

void

msort

(int sr,

int tr1,

int s,

int t)

}/* 對順序表l作歸併排序 */

void

mergesort

(sqlist *l)

非遞迴法:思路複雜,使用輔助空間小

/* 非遞迴法 */

/* 將sr中相鄰長度為s的子串行兩兩歸併到tr */

void

mergepass

(int sr,

int tr,

int s,

int n)

if(i

/* 歸併最後兩個序列 */

merge

(sr,tr,i,i+s-

1,n)

;else

/* 若最後只剩下單個子串行 */

for(j =i;j <= n;j++

) tr[j]

= sr[j];}

/* 對順序表l作歸並非遞迴排序 */

void

mergesort2

(sqlist *l)

}

快速排序
選擇乙個樞軸,把比樞軸小的排在前面,把大的排在後面,在前半段和後半段重新進行此過程

樞軸的選擇很重要

/* 快速排序******************************** */

/* 交換順序表l中子表的記錄,使樞軸記錄到位,並返回其所在位置 */

/* 此時在它之前(後)的記錄均不大(小)於它。 */

intpartition

(sqlist *l,

int low,

int high)

return low;

/* 返回樞軸所在位置 */

}/* 對順序表l中的子串行l->r[low..high]作快速排序 */

void

qsort

(sqlist *l,

int low,

int high)

}/* 對順序表l作快速排序 */

void

quicksort

(sqlist *l)

/* **************************************** */

優化:

1.優化選取樞軸

2.優化不必要的交換

3.優化小陣列時的排序方案

4.優化遞迴操作

/* 改進後快速排序******************************** */

/* 快速排序優化演算法 */

intpartition1

(sqlist *l,

int low,

int high)

l->r[low]

=l->r[0]

;return low;

/* 返回樞軸所在位置 */

}void

qsort1

(sqlist *l,

int low,

int high)

else

insertsort

(l);

}/* 對順序表l作快速排序 */

void

quicksort1

(sqlist *l)

/* 4.優化遞迴操作 */

/* 尾遞迴 */

void

qsort2

(sqlist *l,

int low,

int high)

}else

insertsort

(l);

}/* 對順序表l作快速排序(尾遞迴) */

void

quicksort2

(sqlist *l)

大話資料結構讀書筆記

第一章 資料結構的定義 資料就夠是相互直接存在一種或多種特定關係的資料元素的集合 邏輯結構 集合結構 線性結構 樹形結構 圖形結構 第二章 演算法 1 演算法的特性 輸入 輸出 有窮性 確定性和可行性 2 演算法事假複雜度定義 在進行演算法分析時,語句總的次數t n 第三章1 線性表 定義 零個或多...

大話資料結構 讀書筆記

是相互之間存在一種或多種特定關係的資料元素的集合。說白了就是資料的集合 但是集合裡面的資料之間存在特地的關係 這翻譯得好像沒說一樣 是指資料元素之間的相互關係 指資料的邏輯結構在計算機儲存形式 鏈式儲存結構 是把資料元素存放在任意的儲存單元 這組儲存單元可以是連續的 也可以是不連續的 資料型別指的是...

讀書筆記 大話資料結構 1

對於電腦科學,資料結構的重要性不言而喻。它對於乙個程式設計師的功力的提高起著關鍵的作用。勿在浮沙築高台,想要成為一名合格的hacker。基礎理論決定乙個程式設計師思維的深度。介於此,決定認真學習資料結構,找到比較基礎易懂的大話資料結構來開始我的學習之旅。資料結構 相互之間存在一種或多種特定關係的資料...