青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Life is Good.

Enhance Tech and English
隨筆 - 65, 文章 - 20, 評論 - 21, 引用 - 0
數據加載中……

常見排序算法總結

穩定排序和非穩定排序

簡單地說就是所有相等的數經過某種排序方法后,仍能保持它們在排序之前的相對次序,我們就說這種排序方法是穩定的。反之,就是非穩定的。要注意的 是,排序算法的穩定性是針對所有輸入實例而言的。即在所有可能的輸入實例中,只要有一個實例使得算法不滿足穩定性要求,則該排序算法就是不穩定的。
比如:一組數排序前是a1,a2,a3,a4,a5,其中a2=a4,經過某種排序后為a1,a2,a4,a3,a5,則我們說這種排序是穩定的,因為a2排序前在a4的前面,排序后它還是在a4的前面。假如變成a1,a4,a2,a3,a5就不是穩定的了。

2、內排序和外排序

在排序過程中,所有需要排序的數都在內存,并在內存中調整它們的存儲順序,稱為內排序;
在排序過程中,只有部分數被調入內存,并借助內存調整數在外存中的存放順序排序方法稱為外排序。

3、算法的時間復雜度和空間復雜度

所謂算法的時間復雜度,是指執行算法所需要的計算工作量。
一個算法的空間復雜度,一般是指執行這個算法所需要的內存空間。

=======================================

一.插入排序

首先新建一個空列表,用于保存已排序的有序數列(我們稱之為"有序列表")。
從原數列中取出一個數,將其插入"有序列表"中,使其仍舊保持有序狀態。
重復2號步驟,直至原數列為空。
插入排序的平均時間復雜度為平方級的,效率不高,但是容易實現。它借助了"逐步擴大成果"的思想,使有序列表的長度逐漸增加,直至其長度等于原列表的長度。

①.直接插入排序(穩定)
     接插入排序的過程為:在插入第i個記錄時,R1,R2,..Ri-1已經排好序,將第i個記錄的排序碼Ki依次和R1,R2,..,Ri-1的排序碼逐個進行比較,找到適當的位置。使用直接插入排序,對于具有n個記錄的文件,要進行n-1趟排序。

代碼如下:

void Dir_Insert(int A[],int N)   //直接插入排序
{
     int j,t;
     for(int i=1;i<N;i++)
     {
         t=A[i];
         j=i-1;
         while(A[j]>t)
         {
             A[j+1]=A[j];
             j--;
         }
         A[j+1]=t;
     }
}


②.希爾排序(不穩定):
     希爾(Shell)排序的基本思想是:先取一個小于n的整數d1作為第一個增量把文件的全部記錄分成d1個組。所有距離為d1的倍數的記錄放在同一個組 中。先在各組內進行直接插入排序;然后,取得第二個增量d2<d1重復上述的分組和排序,直至所取的增量di=1,即所有記錄放在同一組中進行直接 插入排序為止。該方法實質上是一種分組插入方法。
     一般取d1=n/2,di+1=di/2。如果結果為偶數,則加1,保證di為奇數。
     希爾排序是不穩定的,希爾排序的執行時間依賴于增量序列,其平均時間復雜度為O(n^1.3).

代碼如下:

void Shell(int A[],int n)   //Shell排序
{
     int i,j,k,t;
     (n/2)%2 == 0 ? k = n/2+1 : k = n/2; //保證增量為奇數
     while(k > 0)
     {
         for(j=k;j<n; j++)
         {
             t = A[j];
             i = j - k;
             while(i>=0 && A[i]>t)
             {
                 A[i+k]=A[i];
                 i=i-k;
             }
             A[i+k]=t;
         }
         if(k == 1) break;
         (k/2)%2 ==0 ? k=k/2+1 : k=k/2;
     }
}

==============================================

二.選擇排序

設數組內存放了n個待排數字,數組下標從1開始,到n結束。
i=1
從數組的第i個元素開始到第n個元素,尋找最小的元素。
將上一步找到的最小元素和第i位元素交換。
如果i=n-1算法結束,否則回到第3步

①.直接選擇排序(不穩定)
     直接選擇排序的過程是:首先在所有記錄中選出序碼最小的記錄,把它與第1個記錄交換,然后在其余的記錄內選出排序碼最小的記錄,與第2個記錄交換......依次類推,直到所有記錄排完為止。
     無論文件初始狀態如何,在第i趟排序中選出最小關鍵字的記錄,需要做n-i次比較,因此,總的比較次數為n(n-1)/2=O(n^2)。當初始文件為正 序時,移動次數為0;文件初態為反序時,每趟排序均要執行交換操作,總的移動次數取最大值3(n-1)。直接選擇排序的平均時間復雜度為O(n^2)。直 接選擇排序是不穩定的。

代碼如下:

void Dir_Choose(int A[],int n)   //直接選擇排序
{
     int k,t;
     for(int i=0;i<n-1;i++)
     {
         k=i;
         for(int j=i+1;j<n;j++)
         {
             if(A[j]<A[k]) k=j;
         }
         if(k!=i)
         {
             t=A[i];
             A[i]=A[k];
             A[k]=t;
         }
     }
}


②.堆排序(不穩定)
首 先新建一個空列表,作用與插入排序中的"有序列表"相同。  找到數列中最大的數字,將其加在"有序列表"的末尾,并將其從原數列中刪除。 重復2號步驟,直至原數列為空。 堆排序的平均時間復雜度為nlogn,效率高(因為有堆這種數據結構以及它奇妙的特征,使得"找到數列中最大的數字"這樣的操作只需要O(1)的時間復雜 度,維護需要logn的時間復雜度),但是實現相對復雜(可以說是這里7種算法中比較難實現的)。 看起來似乎堆排序與插入排序有些相像,但他們其實是本質不同的算法。至少,他們的時間復雜度差了一個數量級,一個是平方級的,一個是對數級的。     

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。n個關鍵字序列
K1,K2,...,Kn 稱為堆,當且僅當該序列滿足(Ki<=K2i且Ki<=K2i+1)或(Ki>=K2i且Ki>=K2i+1),(1& lt;=i<=n/2)。根結點(堆頂)的關鍵字是堆里所有結點關鍵字中最小者,稱為小根堆;根結點的關鍵字是堆里所有結點關鍵字中最大者,稱為大 根堆。
     若將此序列所存儲的向量R[1..n]看作是一棵完全二叉樹的存儲結構,則堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大于(或不小于)其左右孩子(若存在)結點的關鍵字。
     堆排序的關鍵步驟有兩個:一是如何建立初始堆;二是當堆的根結點與堆的最后一個結點交換后,如何對少了一個結點后的結點序列做調整,使之重新成為堆。堆排 序的最壞時間復雜度為O(nlog2n),堆排序的平均性能較接近于最壞性能。由于建初始堆所需的比較 次數較多,所以堆排序不適宜于記錄較少的文件。堆排序是就地排序,輔助空間為O(1),它是不穩定的排序方法。

代碼略..

====================================

三.交換排序

兩兩比較待排序記錄的排序碼,并交換不滿足順序要求的那寫偶對,直到滿足條件為止。交換排序的主要方法有冒泡排序和快速排序.

①.冒泡排序(穩定的)
首 先將所有待排序的數字放入工作列表中。 從列表的第一個數字到倒數第二個數字,逐個檢查:若某一位上的數字大于他的下一位,則將它與它的下一位交換。 重復2號步驟,直至再也不能交換。 冒泡排序的平均時間復雜度與插入排序相同,也是平方級的,但也是非常容易實現的算法。    

冒泡排序將被排序的記錄數組R[1..n]垂直排列,每個記錄R[i]看作是重量為ki的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R;凡掃描到違反本原則的輕氣泡,就使其向上"漂浮"。如此反復進行,直到最后任何兩個氣泡都是輕者在上,重者在下為止。
     冒泡排序的具體過程如下:
     第一步,先比較k1和k2,若k1>k2,則交換k1和k2所在的記錄,否則不交換。繼續對k2和k3重復上述過程,直到處理完kn-1和kn。這時最大的排序碼記錄轉到了最后位置,稱第1次起泡,共執行n-1次比較。
     與第一步類似,從k1和k2開始比較,到kn-2和kn-1為止,共執行n-2次比較。
     依次類推,共做n-1次起泡,完成整個排序過程。
     若文件的初始狀態是正序的,一趟掃描即可完成排序。所需關鍵字比較次數為n-1次,記錄移動次數為0。因此,冒泡排序最好的時間復雜度為O(n)。
     若初始文件是反序的,需要進行n-1趟排序。每趟排序要進行n-i次關鍵字的比較(1<=i<=n-1),且每次比較都必須移動記錄三次來達 到交換記錄位置。在這種情況下,比較次數達到最大值n(n-1)/2=O(n^2),移動次數也達到最大值3n(n-1)/2=O(n^2)。因此,冒泡 排序的最壞時間復雜度為O(n^2)。
     雖然冒泡排序不一定要進行n-1趟,但由于它的記錄移動次數較多,故平均性能比直接插入排序要差得多。冒泡排序是就地排序,且它是穩定的。

代碼如下:

void QP(int A[],int n)   //優化的冒泡排序
{
     int count=0,t,flag;
     for(int i=0;i<n-1;i++)
     {
         flag=0;
         for(int j=0;j<n-i;j++)
         {
             if(A[j+1]<A[j])
             {
                 t=A[j];
                 A[j]=A[j+1];
                 A[j+1]=t;
                 flag=1;
                 count+=3;
             }
         }
         if(flag==0) break;
     }
}


②.快速排序:(不穩定的)

實踐證 明,快速排序是所有排序算法中最高效的一種。它采用了分治的思想:先保證列表的前半部分都小于后半部分,然后分別對前半部分和后半部分排序,這樣整個列表 就有序了。這是一種先進的思想,也是它高效的原因。因為在排序算法中,算法的高效與否與列表中數字間的比較次數有直接的關系,而"保證列表的前半部分都小 于后半部分"就使得前半部分的任何一個數從此以后都不再跟后半部分的數進行比較了,大大減少了數字間不必要的比較。但查找數據得另當別論了。

     快速排序采用了一種分治的策略,通常稱其為分治法,其基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞歸地解這些子問題,然后將這些子問題的解組合為原問題的解。
     快速排序的具體過程如下:
     第一步,在待排序的n個記錄中任取一個記錄,以該記錄的排序碼為準,將所有記錄分成兩組,第1組各記錄的排序碼都小于等于該排序碼,第2組各記錄的排序碼都大于該排序碼,并把該記錄排在這兩組中間。
     第二步,采用同樣的方法,對左邊的組和右邊的組進行排序,直到所有記錄都排到相應的位置為止。

代碼如下:

void Quick_Sort(int A[],int low,int high)   //low和high是數組的下標
{
     if(low<high)
     {
         int temp,t=A[low];
         int l=low,h=high;
         while(l<h)
         {
             while(A[l]<t) l++;
             while(A[h]>=t) h--;
             if(h>l)
             {
                 temp=A[l];
                 A[l]=A[h];
                 A[h]=temp;
             }
         }
         Quick_Sort(A,low,l-1);
         Quick_Sort(A,l+1,high);
     }
}

==================================

四.歸并排序
     歸并排序是將兩個或兩個以上的有序子表合并成一個新的有序表。初始時,把含有n個結點的待排序序列看作由n個長度都為1的有序子表組成,將它們依次兩兩歸并得到長度為2的若干有序子表,再對它們兩兩合并。直到得到長度為n的有序表,排序結束。
     歸并排序是一種穩定的排序,可用順序存儲結構,也易于在鏈表上實現,對長度為n的文件,需進行log2n趟二路歸并,每趟歸并的時間為O(n),故其時間 復雜度無論是在最好情況下還是在最壞情況下均是O(nlog2n)。歸并排序需要一個輔助向量來暫存兩個有序子文件歸并的結果,故其輔助空間復雜度為 O(n),顯然它不是就地排序。

代碼略...

=================================

五.基數排序
設單關鍵字的每個分量的取值范圍均是C0<=Kj<=Crd-1(0<=j<=rd),可能的取值個數rd稱為基數.基數的選擇和關鍵字的分解因關鍵字的類型而異.
  (1).若關鍵字是十進制整數,則按個、十等位進行分解,基數rd=10,C0=0,C9=9,d為最長整數的位數.
  (2).若關鍵字是小寫的英文字符串,則rd=26,C0='a',C25='z',d為最長字符串的長度.
  基數排序的基本思想是:從低位到高位依次對待排序的關鍵碼進行分配和收集,經過d趟分配和收集,就可以得到一個有序序列.

===================================

總結總結!

按平均時間將排序分為四類

(1)平方階(O(n2))排序
      一般稱為簡單排序,例如直接插入、直接選擇和冒泡排序;
(2)線性對數階(O(nlgn))排序
      如快速、堆和歸并排序;
(3)O(n1+£)階排序
      £是介于0和1之間的常數,即0<£<1,如希爾排序;
(4)線性階(O(n))排序
      如基數排序。

各種排序方法比較
      簡單排序中直接插入最好,快速排序最快,當文件為正序時,直接插入和冒泡均最佳。

影響排序效果的因素
     因為不同的排序方法適應不同的應用環境和要求,所以選擇合適的排序方法應綜合考慮下列因素:
  ①待排序的記錄數目n;
  ②記錄的大小(規模);
  ③關鍵字的結構及其初始狀態;
  ④對穩定性的要求;
  ⑤語言工具的條件;
  ⑥存儲結構;
  ⑦時間和輔助空間復雜度等。

不同條件下,排序方法的選擇

(1)若n較小(如n≤50),可采用直接插入或直接選擇排序。
      當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少于直接插人,應選直接選擇排序為宜。
(2)若文件初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;
(3)若n較大,則應采用時間復雜度為O(nlgn)的排序方法:快速排序、堆排序或
歸并排序。
     快速排序是目前基于比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
     堆排序所需的輔助空間少于快速排序,并且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。
     若要求排序穩定,則可選用歸并排序。但從單個記錄起進行兩兩歸并的   排序算法并不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子文件,然后再兩兩歸并之。因為直接插入排序是穩定 的,所以改進后的歸并排序仍是穩定的。

=======================================

=========另一版=========================

=======================================

選擇排序

在要排序的一組數中,選出最小的一個數與第一個位置的數交換;
然后在剩下的數當中再找最小的與第二個位置的數交換,如此循環
到倒數第二個數和最后一個數比較為止。

選擇排序是不穩定的。算法復雜度O(n2)--[n的平方]

void select_sort(int *x, int n)
{
int i, j, min, t;

for (i=0; i<n-1; i++) /*要選擇的次數:0~n-2共n-1次*/
{
   min = i; /*假設當前下標為i的數最小,比較后再調整*/
   for (j=i+1; j<n; j++)/*循環找出最小的數的下標是哪個*/
   {
    if (*(x+j) < *(x+min))
    {   
     min = j; /*如果后面的數比前面的小,則記下它的下標*/
    }
   }  
  
   if (min != i) /*如果min在循環中改變了,就需要交換數據*/
   {
    t = *(x+i);
    *(x+i) = *(x+min);
    *(x+min) = t;
   }
}
}

直接插入排序

在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排
好順序的,現在要把第n個數插到前面的有序數中,使得這n個數
也是排好順序的。如此反復循環,直到全部排好順序。

直接插入排序是穩定的。算法時間復雜度O(n2)--[n的平方]

void insert_sort(int *x, int n)
{
int i, j, t;

for (i=1; i<n; i++) /*要選擇的次數:1~n-1共n-1次*/
{
   /*
    暫存下標為i的數。注意:下標從1開始,原因就是開始時
    第一個數即下標為0的數,前面沒有任何數,單單一個,認為
    它是排好順序的。
   */
   t=*(x+i);
   for (j=i-1; j>=0 && t<*(x+j); j--) /*注意:j=i-1,j--,這里就是下標為i的數,在它前面有序列中找插入位置。*/
   {
    *(x+j+1) = *(x+j); /*如果滿足條件就往后挪。最壞的情況就是t比下標為0的數都小,它要放在最前面,j==-1,退出循環*/
   }

   *(x+j+1) = t; /*找到下標為i的數的放置位置*/
}
}

冒泡排序

在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上
而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較
小的往上冒。即:每當兩相鄰的數比較后發現它們的排序與排序要
求相反時,就將它們互換。

下面是一種改進的冒泡算法,它記錄了每一遍掃描后最后下沉數的
位置k,這樣可以減少外層循環掃描的次數。

冒泡排序是穩定的。算法時間復雜度O(n2)--[n的平方]

void bubble_sort(int *x, int n)
{
int j, k, h, t;
  
for (h=n-1; h>0; h=k) /*循環到沒有比較范圍*/
{
   for (j=0, k=0; j<h; j++) /*每次預置k=0,循環掃描后更新k*/
   {
    if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/
    {
     t = *(x+j);
     *(x+j) = *(x+j+1);
     *(x+j+1) = t; /*完成交換*/
     k = j; /*保存最后下沉的位置。這樣k后面的都是排序排好了的。*/
    }
   }
}
}


希爾排序

在直接插入排序算法中,每次插入一個數,使有序序列只增加1個節點,
并且對插入下一個數沒有提供任何幫助。如果比較相隔較遠距離(稱為
增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除
多個元素交換。D.L.shell于1959年在以他名字命名的排序算法中實現
了這一思想。算法先將要排序的一組數按某個增量d分成若干組,每組中
記錄的下標相差d.對每組中全部元素進行排序,然后再用一個較小的增量
對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成
一組,排序完成。

下面的函數是一個希爾排序算法的一個實現,初次取序列的一半為增量,
以后每次減半,直到增量為1。

希爾排序是不穩定的。

void shell_sort(int *x, int n)
{
int h, j, k, t;

for (h=n/2; h>0; h=h/2) /*控制增量*/
{
   for (j=h; j<n; j++) /*這個實際上就是上面的直接插入排序*/
   {
    t = *(x+j);
    for (k=j-h; (k>=0 && t<*(x+k)); k-=h)
    {
     *(x+k+h) = *(x+k);
    }
    *(x+k+h) = t;
   }
}
}


快速排序

快速排序是對冒泡排序的一種本質改進。它的基本思想是通過一趟
掃描后,使得排序序列的長度能大幅度地減少。在冒泡排序中,一次
掃描只能確保最大數值的數移到正確位置,而待排序序列的長度可能只
減少1。快速排序通過一趟掃描,就能確保某個數(以它為基準點吧)
的左邊各數都比它小,右邊各數都比它大。然后又用同樣的方法處理
它左右兩邊的數,直到基準點的左右只有一個元素為止。它是由
C.A.R.Hoare于1962年提出的。

顯然快速排序可以用遞歸實現,當然也可以用棧化解遞歸實現。下面的
函數是用遞歸實現的,有興趣的朋友可以改成非遞歸的。

快速排序是不穩定的。最理想情況算法時間復雜度O(nlog2n),最壞O(n2)

void quick_sort(int *x, int low, int high)
{
int i, j, t;

if (low < high) /*要排序的元素起止下標,保證小的放在左邊,大的放在右邊。這里以下標為low的元素為基準點*/
{
   i = low;
   j = high;
   t = *(x+low); /*暫存基準點的數*/

   while (i<j) /*循環掃描*/
   {
    while (i<j && *(x+j)>t) /*在右邊的只要比基準點大仍放在右邊*/
    {
     j--; /*前移一個位置*/
    }

    if (i<j)
    {
     *(x+i) = *(x+j); /*上面的循環退出:即出現比基準點小的數,替換基準點的數*/
     i++; /*后移一個位置,并以此為基準點*/
    }

    while (i<j && *(x+i)<=t) /*在左邊的只要小于等于基準點仍放在左邊*/
    {
     i++; /*后移一個位置*/
    }

    if (i<j)
    {
     *(x+j) = *(x+i); /*上面的循環退出:即出現比基準點大的數,放到右邊*/
     j--; /*前移一個位置*/
    }
   }

   *(x+i) = t; /*一遍掃描完后,放到適當位置*/
   quick_sort(x,low,i-1);   /*對基準點左邊的數再執行快速排序*/
   quick_sort(x,i+1,high);   /*對基準點右邊的數再執行快速排序*/
}
}

堆排序

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。
堆的定義如下:具有n個元素的序列(h1,h2,...,hn),當且僅當
滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)
時稱之為堆。在這里只討論滿足前者條件的堆。

由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項。完全二叉樹可以
很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。
初始時把要排序的數的序列看作是一棵順序存儲的二叉樹,調整它們的存儲順序,
使之成為一個堆,這時堆的根節點的數最大。然后將根節點與堆的最后一個節點
交換。然后對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點
的堆,并對它們作交換,最后得到有n個節點的有序序列。

從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最后一個元素
交換位置。所以堆排序有兩個函數組成。一是建堆的滲透函數,二是反復調用滲透函數
實現排序的函數。

堆排序是不穩定的。算法時間復雜度O(nlog2n)。

滲透建堆

void sift(int *x, int n, int s)
{
int t, k, j;

t = *(x+s); /*暫存開始元素*/
k = s;   /*開始元素下標*/
j = 2*k + 1; /*右子樹元素下標*/

while (j<n)
{
   if (j<n-1 && *(x+j) < *(x+j+1))/*判斷是否滿足堆的條件:滿足就繼續下一輪比較,否則調整。*/
   {
    j++;
   }

   if (t<*(x+j)) /*調整*/
   {
    *(x+k) = *(x+j);
    k = j; /*調整后,開始元素也隨之調整*/
    j = 2*k + 1;
   }
   else /*沒有需要調整了,已經是個堆了,退出循環。*/
   {
    break;
   }
}

*(x+k) = t; /*開始元素放到它正確位置*/
}

堆排序

void heap_sort(int *x, int n)
{
int i, k, t;
int *p;

for (i=n/2-1; i>=0; i--)
{
   sift(x,n,i); /*初始建堆*/
}

for (k=n-1; k>=1; k--)
{
   t = *(x+0); /*堆頂放到最后*/
   *(x+0) = *(x+k);
   *(x+k) = t;
   sift(x,k,0); /*剩下的數再建堆*/
}
}

===============================================================================
void main()
{
#define MAX 4
int *p, i, a[MAX];

/*錄入測試數據*/
p = a;
printf("Input %d number for sorting :\n",MAX);
for (i=0; i<MAX; i++)
{
   scanf("%d",p++);
}
printf("\n");

/*測試選擇排序*/


p = a;
select_sort(p,MAX);
/**/


/*測試直接插入排序*/

/*
p = a;
insert_sort(p,MAX);
*/


/*測試冒泡排序*/

/*
p = a;
insert_sort(p,MAX);
*/

/*測試快速排序*/

/*
p = a;
quick_sort(p,0,MAX-1);
*/

/*測試堆排序*/

/*
p = a;
heap_sort(p,MAX);
*/

for (p=a, i=0; i<MAX; i++)
{
   printf("%d ",*p++);
}

printf("\n");
system("pause");

posted on 2011-03-12 22:50 Mike Song 閱讀(619) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费久久99精品国产| 国产精品蜜臀在线观看| 亚洲区一区二| 久久午夜国产精品| 久久精品国产清高在天天线 | 欧美一区视频| 亚洲午夜精品网| 亚洲综合欧美| 久久免费视频网| 欧美精品一区三区在线观看| 午夜激情一区| 久久性天堂网| 欧美日韩中文在线| 国产精品久久久久影院亚瑟 | 国产综合欧美| 一区免费视频| 99re6热只有精品免费观看| 亚洲网站视频| 久久大逼视频| 最新中文字幕一区二区三区| 亚洲天堂男人| 免费看亚洲片| 国产精品尤物福利片在线观看| 黄色在线成人| 亚洲视频1区| 久久久久久网站| 亚洲国产精品一区二区www| 亚洲调教视频在线观看| 久久蜜桃香蕉精品一区二区三区| 欧美日韩ab| 国产亚洲欧美日韩精品| 一本久久青青| 免费视频一区| 亚洲国产一区二区在线| 中文一区二区在线观看| 蜜臀91精品一区二区三区| 国产精品一二| 国产一区二区三区电影在线观看 | 亚洲欧美三级伦理| 欧美大尺度在线| 亚洲一区二区三区四区中文| 久久国产精品99国产精| 欧美日韩国产成人| 在线观看国产精品网站| 欧美伊人久久久久久午夜久久久久 | 亚洲欧美日韩国产综合在线| 欧美高清视频一区二区| 韩国一区二区在线观看| 亚洲在线黄色| 99精品久久久| 欧美日韩国产精品| 极品少妇一区二区| 亚洲欧美日韩国产综合精品二区| 亚洲人成亚洲人成在线观看| 久久精品99| 国产日韩欧美在线视频观看| 亚洲一级片在线看| 亚洲国产成人久久综合一区| 久久蜜桃香蕉精品一区二区三区| 精品成人一区二区三区| 久久综合一区| 久久久久久久综合狠狠综合| 狠狠久久婷婷| 欧美中日韩免费视频| 香蕉av777xxx色综合一区| 国产精品美女久久福利网站| 亚洲欧美日韩一区二区在线| 一本到高清视频免费精品| 欧美成人xxx| 亚洲精品在线一区二区| 欧美多人爱爱视频网站| 裸体女人亚洲精品一区| 亚洲激情在线观看视频免费| 亚洲国产成人一区| 欧美日韩精品在线播放| 午夜视频在线观看一区二区| 欧美在线视频播放| 亚洲成色最大综合在线| 亚洲国产精品精华液网站| 欧美日本三级| 中文欧美日韩| 亚洲一区二区三区欧美| 国产日韩欧美综合精品| 久久精品一二三| 欧美一区二区三区在线看| 国产日韩亚洲欧美精品| 久久一区国产| 欧美黑人在线播放| 欧美一区二区大片| 久久日韩粉嫩一区二区三区| 99国产精品久久久久老师| 中国成人在线视频| 国产精品久久久久影院亚瑟| 久久久在线视频| 亚洲精品一区在线| 一区二区动漫| 国产亚洲人成a一在线v站| 亚洲福利国产精品| 国产精品日韩一区二区三区| 欧美专区福利在线| 欧美国产日韩亚洲一区| 亚洲午夜av电影| 久久精品夜色噜噜亚洲aⅴ| 一区二区三欧美| 久久国产日本精品| 亚洲网站在线观看| 久久欧美中文字幕| 午夜亚洲性色福利视频| 欧美1区2区| 欧美影院精品一区| 卡一卡二国产精品| 新狼窝色av性久久久久久| 久久一日本道色综合久久| 一区二区三区四区五区视频| 久久九九热免费视频| 一区二区久久久久久| 久久久久久久久伊人| 欧美亚洲一区二区在线| 免费成人av在线看| 久久噜噜噜精品国产亚洲综合| 欧美日韩理论| 亚洲国产欧美日韩另类综合| 免费亚洲电影在线| 欧美黑人在线播放| 久久全球大尺度高清视频| 欧美日韩国产成人高清视频| 欧美大学生性色视频| 国产综合一区二区| 一区二区冒白浆视频| 亚洲日本久久| 久久精品一区二区三区中文字幕| 亚洲综合电影| 欧美高清在线视频观看不卡| 女人香蕉久久**毛片精品| 国产亚洲精品aa| 午夜精品视频在线观看| 亚洲一区二区在线免费观看视频 | 欧美视频一区| 亚洲精品在线三区| 亚洲精品久久久一区二区三区| 久久久久国产精品厨房| 久久精品一本久久99精品| 国产伦一区二区三区色一情| 亚洲一区免费| 一本色道久久精品| 欧美日韩国产综合视频在线| 亚洲精品欧美极品| 一二三区精品福利视频| 欧美亚洲成人精品| 亚洲人成在线观看| 日韩一二三在线视频播| 欧美日韩国产一中文字不卡| 国产精品99久久久久久有的能看| 亚洲女同在线| 国产亚洲美州欧州综合国| 久久综合久色欧美综合狠狠| 亚洲国产精品第一区二区| 一区二区三区www| 亚洲精品免费看| 销魂美女一区二区三区视频在线| 欧美主播一区二区三区美女 久久精品人| 国产欧美91| 久久九九国产精品| 亚洲国产精品va在线看黑人| 亚洲男人的天堂在线aⅴ视频| 国产精品青草久久久久福利99| 亚洲一区尤物| 久久久www| 1024精品一区二区三区| 欧美护士18xxxxhd| 亚洲女优在线| 开元免费观看欧美电视剧网站| 国产老肥熟一区二区三区| 性色一区二区| 久久精品国产亚洲a| 亚洲国产成人久久综合| 欧美精品一区二区三区久久久竹菊 | 亚洲欧洲偷拍精品| 欧美日韩国产小视频| 午夜久久黄色| 亚洲三级视频| 久久国产手机看片| 日韩一级精品| 久久精品女人| 在线亚洲电影| 国产精品美女在线观看| 久久久久久999| 亚洲午夜国产一区99re久久| 欧美 日韩 国产一区二区在线视频| 夜夜嗨av色一区二区不卡| 国产专区欧美精品| 国产精品xnxxcom| 欧美精品久久99久久在免费线| 欧美在线中文字幕| 亚洲小说春色综合另类电影| 亚洲欧洲偷拍精品| 毛片一区二区三区| 久久精品盗摄| 久久国产精品72免费观看| 一区二区三区不卡视频在线观看 |