八大排序算法~快速排序

八大排序算法~快速排序算法

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);
    }
  }
相關文章
相關標籤/搜索