氣泡排序
通過一次次比較,把小的前移,把最小的排在最前面氣泡排序的優化:
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。基礎理論決定乙個程式設計師思維的深度。介於此,決定認真學習資料結構,找到比較基礎易懂的大話資料結構來開始我的學習之旅。資料結構 相互之間存在一種或多種特定關係的資料...