精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

圖解堆結構、堆排序及堆的應用

開發 前端
這次我們介紹另一種時間復雜度為 O(nlogn) 的選擇類排序方法叫做堆排序。堆(Heap)是計算機科學中一類特殊的數據結構的統稱。堆通常是一個可以被看做一棵 完全二叉樹 的數組對象。

 [[317699]]

 前言

這次我們介紹另一種時間復雜度為 O(nlogn) 的選擇類排序方法叫做堆排序。

我將從以下幾個方面介紹:

  • 堆的結構
  • 堆排序
  • 優化的堆排序
  • 原地堆排序
  • 堆的應用

堆的結構

什么是堆?我給出了百度的定義,如下:

堆(Heap)是計算機科學中一類特殊的數據結構的統稱。堆通常是一個可以被看做一棵 完全二叉樹 的數組對象。

堆總是滿足下列性質:

  • 堆中某個節點的值總是不大于或不小于其父節點的值。
  • 堆總是一棵完全二叉樹。

將根節點最大的堆叫做最大堆,根節點最小的堆叫做最小堆。

下圖展示了一個最大堆的結構:

 

可見,堆中某個節點的值總是小于等于其父節點的值。

由于堆是一棵完全二叉樹,因此我們可以對每一層進行編號,如下:

 

我們完全可以使用數組存放這些元素,那如何確定存放的位置呢?利用如下公式:

  • 父節點:parent(i) = (i-1)/2
  • 左孩子:leftChild(i) = 2*i+1
  • 右孩子:rightChild(i) = 2*i+2

相關代碼如下:

 

  1. private int parent(int index) { 
  2.     return (index - 1) / 2; 
  3.  
  4. private int leftChild(int index) { 
  5.     return index * 2 + 1; 
  6.  
  7. private int rightChild(int index) { 
  8.     return index * 2 + 2; 

 

添加元素

向堆中添加元素的步驟如下:

  1. 將新元素放到數組的末尾。
  2. 獲取新元素的父親節點在數組中的位置,比較新元素和父親節點的值,如果父親節點的值小于新元素的值,那么兩者交換。以此類推,不斷向上比較,直到根節點結束。

下圖展示了添加元素的過程:

 

添加元素的過程也叫做 siftUp ,代碼如下:

  1. // Array是自己實現的動態數組 
  2. private Array<E> data; 
  3.  
  4. public void add(E e) { 
  5.     data.addLast(e); 
  6.     siftUp(data.getSize() - 1); 
  7.  
  8. private void siftUp(int k) { 
  9.     while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0) { 
  10.         data.swap(k, parent(k)); 
  11.         k = parent(k); 
  12.     } 

刪除元素

刪除元素其實就是刪除堆頂的元素,步驟如下:

  • 讓數組最后一個元素和數組第一個元素(堆頂元素)交換。
  • 交換完后,刪除數組最后的元素。
  • 讓堆頂元素和左右孩子節點比較,如果堆頂元素比左右孩子節點中最大的元素還要大,那么滿足堆的性質,直接退出。否則如果堆頂元素比左右孩子節點中最大的元素小,那么堆頂元素就和最大的元素交換,然后繼續重復執行以上操作,只不過這時候把堆頂元素稱為父節點更好。

下圖展示了刪除元素的過程:

 

刪除元素的過程也叫做 siftDown ,代碼如下:

 

  1. // 這里我們不命名為remove,命名為extractMax,抽取堆頂最大元素 
  2. public E extractMax() { 
  3.     E ret = findMax(); 
  4.     // 讓最后一個葉子節點補到根節點,然后讓它下沉 
  5.     // (為什么是取最后一個葉子節點,因為即使取走最后一個葉子節點,依舊能保持是一棵完全二叉樹) 
  6.     data.swap(0, data.getSize() - 1); 
  7.     data.removeLast(); 
  8.     siftDown(0); 
  9.     return ret; 
  10.  
  11. private void siftDown(int k) { 
  12.     while (leftChild(k) < data.getSize()) { 
  13.         int j = leftChild(k); 
  14.         if (j + 1 < data.getSize() && data.get(j + 1).compareTo(data.get(j)) > 0) { 
  15.             j = rightChild(k); 
  16.             // data[j]是leftChild和rightChild中的最大值 
  17.         } 
  18.  
  19.         // 如果父節點比左右孩子中的最大值還要大,那么說明沒有問題,直接退出 
  20.         if (data.get(k).compareTo(data.get(j)) >= 0) { 
  21.             break; 
  22.         } 
  23.         // 否則交換 
  24.         data.swap(k, j); 
  25.         k = j; 
  26.     } 

最大堆的完整代碼

堆排序

通過上面的介紹,我們應該明白了堆的結構,堆的添加和刪除元素操作是如何完成的。那么對于堆排序來說,就是小菜一碟了,因為堆排序就是用到了堆的添加和刪除操作,步驟如下:

  1. 將數組中元素一個個添加到堆(最大堆)中。
  2. 添加完成后,每次取出一個元素倒序放入到數組中。

堆排序代碼:

  1. ublic static void sort(Comparable[] arr) { 
  2.     int n = arr.length; 
  3.     // MaxHeap是自己實現的最大堆 
  4.     MaxHeap<Comparable> maxHeap = new MaxHeap<>(n); 
  5.     for (int i = 0; i < n; i++) { 
  6.         maxHeap.add(arr[i]); 
  7.     } 
  8.     for (int i = n - 1; i >= 0; i--) { 
  9.         arr[i] = maxHeap.extractMax(); 
  10.     } 

堆排序完整代碼

優化的堆排序

在上述的堆排序中,我們在將數組中元素添加到堆時,都是一個個添加,是否有優化的方法呢?答案是有的,我們可以將數組直接轉換成堆,這種操作叫做 Heapify 。

Heapify 就是從最后一個節點開始,判斷父節點是否比孩子節點大,不是就 siftDown 。 Heapify 操作的時間復雜度是 O(n) ,相比一個個添加的時間復雜度是 O(nlogn) ,可見性能提升了不少。

假設我們有數組: [15, 18, 12, 16, 22, 28, 16, 45, 30, 52] ,下圖展示了對其進行 Heapify 的過程。

 

優化的堆排序代碼:

  1. public static void sort(Comparable[] arr) { 
  2.     int n = arr.length; 
  3.     // MaxHeap是自己實現的最大堆,當傳入數組作為構造參數時,會對其進行heapify 
  4.     MaxHeap<Comparable> maxHeap = new MaxHeap<>(arr); 
  5.     for (int i = n - 1; i >= 0; i--) { 
  6.         arr[i] = maxHeap.extractMax(); 
  7.     } 
  8.  
  9. // 構造方法 
  10. public MaxHeap(E[] arr) { 
  11.     data = new Array<>(arr); 
  12.     // 將數組堆化的過程就是從最后一個節點開始,判斷父節點是否比子節點大,不是就siftDown 
  13.     for (int i = parent(arr.length - 1); i >= 0; i--) { 
  14.         siftDown(i); 
  15.     } 

優化的堆排序完整代碼

原地堆排序

原地堆排序可以讓我們的空間復雜度變為 O(1) ,因為不占用新的數組。

原地堆排序類似于堆的刪除元素,步驟如下:

 

  1. Heapify 
  2. siftDown 
  3. siftDown 

下圖展示了原地堆排序的過程:

 

原地堆排序代碼:

 

  1. public static void sort(Comparable[] arr) { 
  2.     int n = arr.length; 
  3.     // heapify 
  4.     for (int i = parent(n-1); i >= 0; i--) { 
  5.         siftDown(arr, n, i); 
  6.     } 
  7.  
  8.     // 核心代碼 
  9.     for (int i = n - 1; i > 0; i--) { 
  10.         swap(arr, 0, i); 
  11.         siftDown(arr, i, 0); 
  12.     } 
  13.  
  14. private static void swap(Object[] arr, int i, int j) { 
  15.     Object t = arr[i]; 
  16.     arr[i] = arr[j]; 
  17.     arr[j] = t; 
  18.  
  19. private static void siftDown(Comparable[] arr, int n, int k) { 
  20.  
  21.     while (leftChild(k) < n) { 
  22.         int j = leftChild(k); 
  23.         if (j + 1 < n && arr[j + 1].compareTo(arr[j]) > 0) { 
  24.             j = rightChild(k); 
  25.         } 
  26.  
  27.         // 如果父節點比左右孩子中的最大值還要大,那么說明沒有問題,直接退出 
  28.         if (arr[k].compareTo(arr[j]) >= 0) { 
  29.             break; 
  30.         } 
  31.  
  32.         // 否則交換 
  33.         swap(arr, k, j); 
  34.         k = j; 
  35.     } 

原地堆排序完整代碼

堆的應用

優先級隊列

一旦我們掌握了堆這個數據結構,那么優先級隊列的實現就很簡單了,只需要弄清楚優先級隊列需要有哪些接口就行。JDK 中自帶的 PriorityQueue 就是用堆實現的優先級隊列,不過需要注意 PriorityQueue 內部使用的是最小堆。

優先級隊列完整代碼

Top K 問題

Top K 問題就是求解 前 K 個 最大的元素或者最小的元素。元素個數不確定,數據量可能很大,甚至源源不斷到來,但需要知道目前為止前 K 個最大或最小的元素。當然問題還可能變為求解 第 K 個 最大的元素或最小的元素。

通常我們有如下解決方案:

  1. 使用JDK中自帶的排序,如 Arrays.sort() ,由于底層使用的快速排序,所以時間復雜度為 O(nlogn) 。但是如果 K 取值很小,比如是 1,即取最大值,那么對所有元素排序就沒有必要了。
  2. 使用簡單選擇排序,選擇 K 次,那么時間復雜度為 O(n*K) ,如果 K 大于 logn,那還不如快排呢!

上述兩種思路都是假定所有元素已知,如果元素個數不確定,且數據源源不斷到來的話,就無能為力了。

下面提供一種新的思路:

我們維護一個長度為 K 的數組,最前面 K 個元素就是目前最大的 K 個元素,以后每來一個新元素,都先找數組中的最小值,將新元素與最小值相比,如果小于最小值,則什么都不變,如果大于最小值,則將最小值替換為新元素。這樣一來,數組中維護的永遠是最大的 K 個元素,不管數據源有多少,需要的內存開銷都是固定的,就是長度為 K 的數組。不過,每來一個元素,都需要找到最小值,進行 K 次比較,是否有辦法能減少比較次數呢?

當然,這時候堆就要登場了,我們使用最小堆維護這 K 個元素,每次來新的元素,只需要和根節點比較,小于等于根節點,不需要變化,否則用新元素替換根節點,然后 siftDown 調整堆即可。此時的時間復雜度為 O(nlogK) ,相比上述兩種方法,效率大大提升,且空間復雜度也大大降低。

Top K 問題代碼:

  1. public class TopK<E extends Comparable<E>> { 
  2.  
  3.     private PriorityQueue<E> p; 
  4.     private int k; 
  5.  
  6.     public TopK(int k) { 
  7.         this.k = k; 
  8.         this.p = new PriorityQueue<>(k); 
  9.     } 
  10.  
  11.     public void addAll(Collection<? extends E> c) { 
  12.         for (E e : c) { 
  13.             add(e); 
  14.         } 
  15.     } 
  16.  
  17.     public void add(E e) { 
  18.         // 未滿k個時,直接添加 
  19.         if (p.size() < k) { 
  20.             p.add(e); 
  21.             return
  22.         } 
  23.  
  24.         E head = p.peek(); 
  25.         if (head != null && head.compareTo(e) >= 0) { 
  26.             // 小于等于TopK中的最小值,不用變 
  27.             return
  28.         } 
  29.         // 否則,新元素替換原來的最小值 
  30.         p.poll(); 
  31.         p.add(e); 
  32.     } 
  33.  
  34.     /** 
  35.      * 獲取當前的最大的K個元素 
  36.      * 
  37.      * @param a   返回類型的空數組 
  38.      * @param <T> 
  39.      * @return TopK以數組形式 
  40.      */ 
  41.     public E[] toArray(E[] a) { 
  42.         return p.toArray(a); 
  43.     } 
  44.  
  45.     /** 
  46.      * 獲取第K個最大的元素 
  47.      * 
  48.      * @return 第K個最大的元素 
  49.      */ 
  50.     public E getKth() { 
  51.         return p.peek(); 
  52.     } 
  53.  
  54.     public static void main(String[] args) { 
  55.         TopK<Integer> top5 = new TopK<>(5); 
  56.         top5.addAll(Arrays.asList(88, 1, 5, 7, 28, 12, 3, 22, 20, 70)); 
  57.         System.out.println("top5:" + Arrays.toString(top5.toArray(new Integer[0]))); 
  58.         System.out.println("5th:" + top5.getKth()); 
  59.     } 
  60.  

這里我們直接利用 JDK 自帶的由最小堆實現的優先級隊列 PriorityQueue 。

依此思路,可以實現求前 K 個最小元素,只需要在實例化 PriorityQueue 時傳入一個反向比較器參數,然后更改 add 方法的邏輯。

中位數

堆也可以用于求解中位數,數據量可能很大且源源不斷到來。

注意:如果元素個數是偶數,那么我們假定中位數取任意一個都可以。

有了上面的例子,這里就很好理解了。我們使用兩個堆,一個最大堆,一個最小堆,步驟如下:

  1. 添加的第一個元素作為中位數 m,最大堆維護 <= m 的元素,最小堆維護 >= m 的元素,兩個堆都不包含 m。
  2. 當添加第二個元素 e 時,將 e 與 m 比較,若 e <= m,則將其加入到最大堆中,否則加入到最小堆中。
  3. 如果出現最小堆和最大堆的元素個數相差 >= 2,則將 m 加入元素個數少的堆中,然后讓元素個數多的堆將根節點移除并賦值給 m。
  4. 以此類推不斷更新。

假設有數組 [20, 30, 40, 50, 2, 4, 3, 5, 7, 8, 10] 。

下圖展示了整個操作的過程:

 

求解中位數的代碼:

  1. public class Median<E extends Comparable<E>> { 
  2.  
  3.     /** 
  4.      * 最小堆 
  5.      */ 
  6.     private PriorityQueue<E> minP; 
  7.  
  8.     /** 
  9.      * 最大堆 
  10.      */ 
  11.     private PriorityQueue<E> maxP; 
  12.  
  13.     /** 
  14.      * 當前中位數 
  15.      */ 
  16.     private E m; 
  17.  
  18.     public Median() { 
  19.         this.minP = new PriorityQueue<>(); 
  20.         this.maxP = new PriorityQueue<>(11, Collections.reverseOrder()); 
  21.     } 
  22.  
  23.     private int compare(E e, E m) { 
  24.         return e.compareTo(m); 
  25.     } 
  26.  
  27.     public void addAll(Collection<? extends E> c) { 
  28.         for (E e : c) { 
  29.             add(e); 
  30.         } 
  31.     } 
  32.  
  33.     public void add(E e) { 
  34.         // 第一個元素 
  35.         if (m == null) { 
  36.             m = e; 
  37.             return
  38.         } 
  39.  
  40.         if (compare(e, m) <= 0) { 
  41.             // 小于等于中值,加入最大堆 
  42.             maxP.add(e); 
  43.         } else { 
  44.             // 大于中值,加入最大堆 
  45.             minP.add(e); 
  46.         } 
  47.  
  48.         if (minP.size() - maxP.size() >= 2) { 
  49.             // 最小堆元素個數多,即大于中值的數多 
  50.             // 將 m 加入到最大堆中,然后將最小堆中的根移除賦給 m 
  51.             maxP.add(m); 
  52.             m = minP.poll(); 
  53.         } else if (maxP.size() - minP.size() >= 2) { 
  54.             minP.add(m); 
  55.             m = maxP.poll(); 
  56.         } 
  57.  
  58.     } 
  59.  
  60.     public E getMedian() { 
  61.         return m; 
  62.     } 
  63.  
  64.     public static void main(String[] args) { 
  65.         Median<Integer> median = new Median<>(); 
  66.         median.addAll(Arrays.asList(20, 30, 40, 50, 2, 4, 3, 5, 7, 8, 10)); 
  67.         System.out.println(median.getMedian()); 
  68.     } 
  69.  

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2020-08-31 07:43:58

二叉堆大頂堆存儲

2019-02-26 14:33:22

JVM內存虛擬機

2020-05-27 21:13:27

JavaJVM內存

2025-04-29 09:56:39

Python數據結構開發

2022-04-18 07:01:36

二叉堆大根堆小根堆

2022-12-26 14:41:38

Linux內存

2021-03-23 08:33:22

Java數據結構算法

2024-05-27 00:03:00

Java數據JVM

2022-09-05 08:06:49

數據結構Java

2020-11-23 08:53:34

堆Heap

2024-03-29 09:12:43

Go語言工具

2020-07-13 09:16:04

Java集合

2021-01-19 07:02:26

算法數據結構堆排序

2011-04-20 15:06:44

堆排序

2023-04-06 07:39:48

2014-10-30 15:59:10

2023-02-26 00:00:06

JVM深堆支配樹

2022-03-04 10:44:01

堆噴射惡意代碼

2021-07-28 20:12:17

WindowsHeap內存

2012-02-20 11:33:29

Java
點贊
收藏

51CTO技術棧公眾號

国产又大又长又粗| 粗大的内捧猛烈进出视频| 国产粉嫩一区二区三区在线观看| 美女视频一区免费观看| 亚洲最新视频在线| 在线看免费毛片| 91视频欧美| 日本一区二区三区四区在线视频| 欧美一区二区三区成人| 中文字幕亚洲欧美| 亚洲欧美日本在线| 性xxxxfjsxxxxx欧美| 国产韩日影视精品| 日韩一区二区在线看| 男人添女人下面高潮视频| 国精产品一品二品国精品69xx | 国产黄色在线播放| 亚洲影视一区二区三区| 亚洲精品动漫久久久久| 波多野结衣作品集| 久草在线新免费首页资源站| 国产人伦精品一区二区| 亚洲欧美日韩综合aⅴ视频| 欧美电影免费| 亚洲成人av在线电影| 奇米视频888战线精品播放| 国产精品一区二区av白丝下载| 国产欧美另类| 欧美日韩国产成人| 天堂av在线网站| 97视频在线观看免费| 99久久婷婷国产综合精品电影√| 偷偷色噜狠狠狠狠的777米奇| 51视频国产精品一区二区| 凹凸国产熟女精品视频| 成人毛片av在线| 国产亚洲精品精华液| 成人自拍网站| 国产一区二区自拍视频| 日韩精品91亚洲二区在线观看| 欧美激情在线观看视频| 中文字幕在线2021| 日韩精品久久久久久久电影99爱| 日韩电影中文字幕在线| 无码人妻丰满熟妇啪啪网站| 精品国产亚洲一区二区三区在线| 欧美影院一区二区| 人妻无码视频一区二区三区| 日韩免费啪啪| 久久久亚洲欧洲日产| 51午夜精品国产| 五月激情婷婷在线| 久久精品嫩草影院| 欧美性xxxxx极品少妇| 99热成人精品热久久66| 一二三四视频在线中文| 亚洲成人精品一区二区| 日韩xxxx视频| sm性调教片在线观看 | 欧美一区二区免费| 中文字幕资源在线观看| 福利一区三区| 日韩欧美美女一区二区三区| 日本黄色www| 亚洲啊v在线免费视频| 51精品秘密在线观看| 97免费公开视频| 永久免费精品视频| 亚洲国产欧美一区| 人妻丰满熟妇aⅴ无码| 你微笑时很美电视剧整集高清不卡| 亚洲精品自拍视频| av电影网站在线观看| 日韩欧美精品一区| 久久成年人视频| 日本一级淫片免费放| 亚洲一区日韩在线| 国产精品欧美激情在线播放| 91免费在线视频| 亚洲综合久久网| 美女在线视频一区| 亚洲bt天天射| 午夜成人免费影院| 欧美激情在线一区二区| 浴室偷拍美女洗澡456在线| 日本动漫理论片在线观看网站| 亚洲午夜激情网页| 青青青国产在线视频| 欧美一区二区三区婷婷| 欧美mv日韩mv亚洲| 新91视频在线观看| 亚洲精品小说| 欧美一级视频在线观看| 夜夜爽8888| aaa国产一区| 婷婷四房综合激情五月| 欧美aaaaaaa| 在线亚洲人成电影网站色www| 五月六月丁香婷婷| 97av自拍| 中文字幕在线观看日本| 亚洲大片在线观看| 日本三级黄色网址| 久久综合另类图片小说| 日韩一区av在线| 男女视频免费看| 精东粉嫩av免费一区二区三区| 国产精品亚洲综合| 1区2区3区在线观看| 精品久久香蕉国产线看观看亚洲 | 91久久国产综合| 亚洲欧美日韩国产一区二区| 成人在线视频福利| 日韩一区二区三区不卡| 国产精品欧美一区二区三区| 男人天堂a在线| 4438五月综合| 国产亚洲综合久久| 91蜜桃视频在线观看| 国产在线精品免费| 亚洲欧美精品在线观看| 性xxxxfreexxxxx欧美丶| 日韩女优制服丝袜电影| 国产精品酒店视频| 久久综合影视| 国产一区在线观| 最新av在线播放| 午夜免费久久看| 韩国三级在线播放| 91成人精品| 国产色综合天天综合网 | 国产精品一区免费在线| 中文字幕不卡在线视频极品| 国产视频91在线| 成人深夜福利app| 可以在线看黄的网站| 亚洲国产aⅴ精品一区二区三区| 亚洲午夜性刺激影院| 日韩久久中文字幕| xnxx国产精品| 黄www在线观看| 思热99re视热频这里只精品| 久久久久久久久网站| 国产成人精品毛片| 一区二区三区日韩| 国产一级片中文字幕| 911精品美国片911久久久| 国产日韩欧美夫妻视频在线观看| jizz在线观看中文| 欧美性大战久久| 黄色av片三级三级三级免费看| 丝袜美腿亚洲色图| 天天综合色天天综合色hd| 成人性片免费| 日韩有码在线播放| 国产黄色片av| 一区二区三区在线播放| 香蕉视频xxxx| 伊人成人在线| 久热国产精品视频一区二区三区| 蜜桃视频m3u8在线观看| 亚洲免费视频观看| 国产精品尤物视频| 中文字幕一区二区三| 91丝袜超薄交口足| 午夜福利视频一区二区| 国产精品你懂的在线欣赏| 蜜臀av免费观看| 国产精品不卡| 99视频网站| аⅴ资源天堂资源库在线| 亚洲老头老太hd| 怡红院男人的天堂| 亚洲精品福利视频网站| 日本久久久久久久久久| 羞羞答答国产精品www一本| 日本在线高清视频一区| 亚洲精品69| 97视频人免费观看| 草碰在线视频| 欧美大片日本大片免费观看| 日日噜噜噜噜人人爽亚洲精品| 中文字幕av资源一区| 久久艹这里只有精品| 亚洲国产1区| 日本欧洲国产一区二区| 欧美第一在线视频| 欧美综合在线第二页| 免费在线午夜视频| 日韩高清中文字幕| 91精品视频免费在线观看| 亚洲男女一区二区三区| 免费污网站在线观看| 国产一区在线精品| 精品视频一区二区在线| 一区二区三区午夜视频| 久久久久免费网| 国产一区二区三区免费在线| 欧美在线一级va免费观看| 激情影院在线观看| 亚洲免费影视第一页| 精品人妻av一区二区三区| 狠狠躁夜夜躁人人爽超碰91| 亚洲天堂网av在线| 久久久99免费| 日本一区二区免费视频| 日本在线不卡视频| 亚洲熟妇无码一区二区三区| 91成人精品| 先锋影音日韩| 五月天亚洲色图| 成人三级在线| 日韩欧美激情| 国产精品久久激情| 蜜臀久久精品| 久久久久国产精品免费| 日本在线视频网| 亚洲欧美在线第一页| 狠狠躁夜夜躁av无码中文幕| 337p亚洲精品色噜噜| 波多野结衣电车| 欧美日韩中文在线| 久久久久亚洲av片无码下载蜜桃| 一区在线播放视频| 黄色av免费播放| 久久精品一级爱片| 久久一区二区电影| 成人av网址在线| 极品白嫩的小少妇| 国产一区二区久久| 午夜激情影院在线观看| 麻豆精品在线观看| 色综合天天色综合| 欧美bbbbb| 人人爽人人av| 日日夜夜一区二区| 国产免费一区二区三区视频| 国产欧美不卡| 蜜桃传媒一区二区三区| 亚洲国产精品第一区二区三区 | 日韩一级免费| 九九热只有这里有精品| 午夜精品亚洲| 男人日女人的bb| 国一区二区在线观看| 日本a在线天堂| 激情综合久久| 欧美国产亚洲一区| 国产精品婷婷| 精品中文字幕av| 媚黑女一区二区| 亚洲黄色a v| 六月婷婷色综合| 午夜国产福利在线观看| 国产精品影视网| 国产污在线观看| av一区二区久久| 小毛片在线观看| 久久久久综合网| 91狠狠综合久久久久久| 中文字幕在线免费不卡| 99鲁鲁精品一区二区三区| 玉米视频成人免费看| 国产在线视频99| 日韩欧美黄色动漫| 又骚又黄的视频| 日韩一区和二区| 欧美精品aaaa| 国产乱人伦精品一区| 黑人中文字幕一区二区三区| 亚洲理论电影片| 亚洲啪啪av| 中文字幕人成人乱码| 大西瓜av在线| 久久精品卡一| 嫩草视频免费在线观看| 国产精品综合二区| 婷婷五月精品中文字幕| 国产无遮挡一区二区三区毛片日本| 538精品视频| 亚洲精品免费在线观看| 日韩成人在线免费视频| 欧美午夜理伦三级在线观看| 国产片在线播放| 亚洲精品二三区| 99免在线观看免费视频高清| 欧美国产日韩中文字幕在线| 97se综合| 18成人免费观看网站下载| 在线视频亚洲专区| 椎名由奈jux491在线播放| 影音先锋亚洲一区| 午夜免费一区二区| 丁香婷婷综合网| 夜夜春很很躁夜夜躁| 亚洲综合丝袜美腿| 中国精品一区二区| 亚洲第一偷拍网| 秋霞a级毛片在线看| 97超级碰碰碰久久久| 精品中文字幕一区二区三区| 欧美日韩亚洲免费| 国产精品成人一区二区网站软件| 欧美xxxxx在线视频| 国产精品一区二区男女羞羞无遮挡| 37p粉嫩大胆色噜噜噜| 亚洲欧洲中文日韩久久av乱码| 成年免费在线观看| 欧美一级一级性生活免费录像| 清纯唯美亚洲色图| 欧美高清不卡在线| japansex久久高清精品| 欧美日本亚洲| 亚洲精品孕妇| 伊人五月天婷婷| 国产精品少妇自拍| 伊人中文字幕在线观看| 亚洲第一视频网| 丝袜在线观看| 92福利视频午夜1000合集在线观看| 国产乱码精品一区二区三区四区| 中国丰满熟妇xxxx性| 国产一区二区三区在线观看免费视频| 无码少妇精品一区二区免费动态| 亚洲成在线观看| 亚洲国产综合网| 美女福利精品视频| 欧美成人毛片| 亚洲春色在线视频| 久久高清免费观看| 特大黑人巨人吊xxxx| 午夜影视日本亚洲欧洲精品| 亚洲成人77777| 欧美成aaa人片在线观看蜜臀| 色婷婷成人网| 在线视频福利一区| 九九久久精品视频| 日韩av片在线免费观看| 欧美性大战久久久久久久蜜臀| 国产一区二区三区福利| 日韩av观看网址| 国产精品欧美在线观看| 97在线免费公开视频| 久久综合九色综合久久久精品综合 | 99香蕉久久| 男女激情免费视频| 国产99久久久国产精品潘金网站| 草视频在线观看| 日韩欧美中文一区二区| av网站在线免费看推荐| 999国内精品视频在线| 激情欧美日韩一区| 午夜av免费看| 一本久久综合亚洲鲁鲁五月天 | 国产精品333| 91女厕偷拍女厕偷拍高清| 久久国产黄色片| 亚洲欧洲在线看| 国产成人福利夜色影视| 自拍偷拍亚洲色图欧美| 国产激情一区二区三区| 国产一级中文字幕| 精品亚洲aⅴ在线观看| 国产丝袜视频在线观看| 你懂的国产精品永久在线| 欧美mv日韩mv亚洲| 国产一级精品视频| 日韩高清人体午夜| 日韩av超清在线观看| 亚洲蜜桃在线| 国产精品小仙女| 国产精品16p| 亚洲视频在线看| 91国拍精品国产粉嫩亚洲一区| 中文字幕日韩精品一区二区| 国产成人一区二区精品非洲| 亚洲精品蜜桃久久久久久| 蜜臀av性久久久久蜜臀aⅴ| 天天做夜夜爱爱爱| 精品99一区二区三区| 性感美女一区二区在线观看| 亚洲一区免费看| 成人在线综合网站| 日本免费在线观看视频| 欧美性猛交xxxxx水多| 日韩www视频| 亚洲制服丝袜av| 成人高清免费观看mv| 亚洲综合中文字幕68页| 国产精品久久久久久久免费软件| youjizz亚洲女人| 精品三级在线观看| 91精品美女| 日韩中字在线观看| 国产精品欧美一区二区三区| 色婷婷在线视频| 欧美视频一区在线观看| 国产一区二区在线视频播放| 51漫画成人app入口| 久久久视频在线|