八大排序算法~快速排序算法
1,思想:spa
(1)任取一個元素,例如從第一個元素,以之爲中心點;指針
(2)比這個中心點小的放到它前邊;比中心點大放到它後邊;造成以中心點爲劃分的左右兩個子表;code
(3)兩個子表內部再重複進行該過程(一、2),直到子表內部元素個數爲1;blog
2,過程分析:排序
要實現的效果是:【前空間(放‘’小數「」) 中心點 後空間(放「大數」)】遞歸
(1)假定中心點元素:假定第一個元素爲中心點,而後中心點暫時存在哨兵元素位置上 【第一個元素空間就空出來啦~【前】有了空間】it
(2)初始化low、high指針:low初始化爲表的第一個元素位置;high初始化爲表的最後一個元素位置;io
(3)由於【前】有空間,咱就先從high開始遍歷找「小數」,找到「小數」後,放到空出來的空間~【前】空間;class
而後原來「小數」的空間便空出來了【後】有空間啦;接着,咱就從low開始遍歷找「大數」,找到「大數」後,放到空出來的空間~【後】空間;
(4)直到low = high,肯定中心點位置;
(5)對以中心點爲劃分的兩個子鏈表重複該過程,直到子鏈表中的元素長度爲1;~嗯,遞歸的味道啦
3,代碼:
int Partitition(SqList &L, int low, int high){ L.r[0] = L.r[low]; //假設第一個元素是中心點,將其放到哨兵元素位置上,則【前】有空間啦 //從【後】開始找小數放【前】,(而後由於【後】,有空間)【前】開始找大數放【後】,知道low == high while(low < high){ while(L.r[high] >= L.r[0]){ high--; } L.r[low] = L.r[high]; while(L.r[low] <= L.r[0]){ low++; } L.r[high] = L.r[row]; } L.r[row] = L.r[0]; return row; } //對順序錶快速排序 void QSort(SqList &L, int low, int high){ if(low < high){ //鏈表的長度不爲1 int mid = Partitition(L, low, high); //將鏈表一分爲二,以中心點排好位置 QSort(L,low, mid -1); QSort(L, mid +1, high); } }