69堂国产成人免费视频_亚洲成人999_最新日韩中文字幕_97在线视频免费_91久久国产精品_欧美美女一区二区_亚洲a级在线观看_亚洲最大成人免费视频_av中文字幕不卡_一本色道久久综合亚洲精品按摩

更多精彩內(nèi)容,歡迎關(guān)注:

視頻號(hào)
視頻號(hào)

抖音
抖音

快手
快手

微博
微博

堆排序是穩(wěn)定的排序算法

文檔

堆排序是穩(wěn)定的排序算法

堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆積是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。堆排序可以說是一種利用堆的概念來排序的選擇排序。
推薦度:
導(dǎo)讀堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆積是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。堆排序可以說是一種利用堆的概念來排序的選擇排序。
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px}

排序算法是《數(shù)據(jù)結(jié)構(gòu)與算法》中最基本的算法之一。排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。以下是堆排序算法:

堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆積是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:

大頂堆:每個(gè)節(jié)點(diǎn)的值都大于或等于其子節(jié)點(diǎn)的值,在堆排序算法中用于升序排列;小頂堆:每個(gè)節(jié)點(diǎn)的值都小于或等于其子節(jié)點(diǎn)的值,在堆排序算法中用于降序排列;

堆排序的平均時(shí)間復(fù)雜度為 Ο(nlogn)。

1. 算法步驟

創(chuàng)建一個(gè)堆 H[0……n-1];

把堆首(最大值)和堆尾互換;

把堆的尺寸縮小 1,并調(diào)用 shift_down(0),目的是把新的數(shù)組頂端數(shù)據(jù)調(diào)整到相應(yīng)位置;

重復(fù)步驟 2,直到堆的尺寸為 1。

2. 動(dòng)圖演示

代碼實(shí)現(xiàn)JavaScript 實(shí)例 var len; ? ?// 因?yàn)槁暶鞯亩鄠€(gè)函數(shù)都需要數(shù)據(jù)長度,所以把len設(shè)置成為全局變量function buildMaxHeap(arr) { ? // 建立大頂堆? ? len = arr.length;? ? for (var i = Math.floor(len/2); i >= 0; i--) {? ? ? ? heapify(arr, i);? ? }}function heapify(arr, i) { ? ? // 堆調(diào)整? ? var left = 2 * i + 1,? ? ? ? right = 2 * i + 2,? ? ? ? largest = i;? ? if (left < len && arr[left] > arr[largest]) {? ? ? ? largest = left;? ? }? ? if (right < len && arr[right] > arr[largest]) {? ? ? ? largest = right;? ? }? ? if (largest != i) {? ? ? ? swap(arr, i, largest);? ? ? ? heapify(arr, largest);? ? }}function swap(arr, i, j) {? ? var temp = arr[i];? ? arr[i] = arr[j];? ? arr[j] = temp;}function heapSort(arr) {? ? buildMaxHeap(arr);? ? for (var i = arr.length-1; i > 0; i--) {? ? ? ? swap(arr, 0, i);? ? ? ? len--;? ? ? ? heapify(arr, 0);? ? }? ? return arr;}Python實(shí)例 def buildMaxHeap(arr):? ? import math? ? for i in range(math.floor(len(arr)/2),-1,-1):? ? ? ? heapify(arr,i)def heapify(arr, i):? ? left = 2*i+1? ? right = 2*i+2? ? largest = i? ? if left < arrLen and arr[left] > arr[largest]:? ? ? ? largest = left? ? if right < arrLen and arr[right] > arr[largest]:? ? ? ? largest = right? ? if largest != i:? ? ? ? swap(arr, i, largest)? ? ? ? heapify(arr, largest)def swap(arr, i, j):? ? arr[i], arr[j] = arr[j], arr[i]def heapSort(arr):? ? global arrLen? ? arrLen = len(arr)? ? buildMaxHeap(arr)? ? for i in range(len(arr)-1,0,-1):? ? ? ? swap(arr,0,i)? ? ? ? arrLen -=1? ? ? ? heapify(arr, 0)? ? return arrGo實(shí)例 func heapSort(arr []int) []int {? ? ? ? arrLen := len(arr)? ? ? ? buildMaxHeap(arr, arrLen)? ? ? ? for i := arrLen - 1; i >= 0; i-- {? ? ? ? ? ? ? ? swap(arr, 0, i)? ? ? ? ? ? ? ? arrLen -= 1? ? ? ? ? ? ? ? heapify(arr, 0, arrLen)? ? ? ? }? ? ? ? return arr}func buildMaxHeap(arr []int, arrLen int) {? ? ? ? for i := arrLen / 2; i >= 0; i-- {? ? ? ? ? ? ? ? heapify(arr, i, arrLen)? ? ? ? }}func heapify(arr []int, i, arrLen int) {? ? ? ? left := 2*i + 1? ? ? ? right := 2*i + 2? ? ? ? largest := i? ? ? ? if left < arrLen && arr[left] > arr[largest] {? ? ? ? ? ? ? ? largest = left? ? ? ? }? ? ? ? if right < arrLen && arr[right] > arr[largest] {? ? ? ? ? ? ? ? largest = right? ? ? ? }? ? ? ? if largest != i {? ? ? ? ? ? ? ? swap(arr, i, largest)? ? ? ? ? ? ? ? heapify(arr, largest, arrLen)? ? ? ? }}func swap(arr []int, i, j int) {? ? ? ? arr[i], arr[j] = arr[j], arr[i]}Java實(shí)例 public class HeapSort implements IArraySort {? ? @Override? ? public int[] sort(int[] sourceArray) throws Exception {? ? ? ? // 對(duì) arr 進(jìn)行拷貝,不改變參數(shù)內(nèi)容? ? ? ? int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);? ? ? ? int len = arr.length;? ? ? ? buildMaxHeap(arr, len);? ? ? ? for (int i = len - 1; i > 0; i--) {? ? ? ? ? ? swap(arr, 0, i);? ? ? ? ? ? len--;? ? ? ? ? ? heapify(arr, 0, len);? ? ? ? }? ? ? ? return arr;? ? }? ? private void buildMaxHeap(int[] arr, int len) {? ? ? ? for (int i = (int) Math.floor(len / 2); i >= 0; i--) {? ? ? ? ? ? heapify(arr, i, len);? ? ? ? }? ? }? ? private void heapify(int[] arr, int i, int len) {? ? ? ? int left = 2 * i + 1;? ? ? ? int right = 2 * i + 2;? ? ? ? int largest = i;? ? ? ? if (left < len && arr[left] > arr[largest]) {? ? ? ? ? ? largest = left;? ? ? ? }? ? ? ? if (right < len && arr[right] > arr[largest]) {? ? ? ? ? ? largest = right;? ? ? ? }? ? ? ? if (largest != i) {? ? ? ? ? ? swap(arr, i, largest);? ? ? ? ? ? heapify(arr, largest, len);? ? ? ? }? ? }? ? private void swap(int[] arr, int i, int j) {? ? ? ? int temp = arr[i];? ? ? ? arr[i] = arr[j];? ? ? ? arr[j] = temp;? ? }}PHP 實(shí)例 function buildMaxHeap(&$arr){? ? global $len;? ? for ($i = floor($len/2); $i >= 0; $i--) {? ? ? ? heapify($arr, $i);? ? }}function heapify(&$arr, $i){? ? global $len;? ? $left = 2 * $i + 1;? ? $right = 2 * $i + 2;? ? $largest = $i;? ? if ($left < $len && $arr[$left] > $arr[$largest]) {? ? ? ? $largest = $left;? ? }? ? if ($right < $len && $arr[$right] > $arr[$largest]) {? ? ? ? $largest = $right;? ? }? ? if ($largest != $i) {? ? ? ? swap($arr, $i, $largest);? ? ? ? heapify($arr, $largest);? ? }}function swap(&$arr, $i, $j){? ? $temp = $arr[$i];? ? $arr[$i] = $arr[$j];? ? $arr[$j] = $temp;}function heapSort($arr) {? ? global $len;? ? $len = count($arr);? ? buildMaxHeap($arr);? ? for ($i = count($arr) - 1; $i > 0; $i--) {? ? ? ? swap($arr, 0, $i);? ? ? ? $len--;? ? ? ? heapify($arr, 0);? ? }? ? return $arr;}C實(shí)例 #include #include void swap(int *a, int *b) {? ? int temp = *b;? ? *b = *a;? ? *a = temp;}void max_heapify(int arr[], int start, int end) {? ? // 建立父節(jié)點(diǎn)指標(biāo)和子節(jié)點(diǎn)指標(biāo)? ? int dad = start;? ? int son = dad * 2 + 1;? ? while (son <= end) { // 若子節(jié)點(diǎn)指標(biāo)在範(fàn)圍內(nèi)才做比較? ? ? ? if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個(gè)子節(jié)點(diǎn)大小,選擇最大的? ? ? ? ? ? son++;? ? ? ? if (arr[dad] > arr[son]) //如果父節(jié)點(diǎn)大於子節(jié)點(diǎn)代表調(diào)整完畢,直接跳出函數(shù)? ? ? ? ? ? return;? ? ? ? else { // 否則交換父子內(nèi)容再繼續(xù)子節(jié)點(diǎn)和孫節(jié)點(diǎn)比較? ? ? ? ? ? swap(&arr[dad], &arr[son]);? ? ? ? ? ? dad = son;? ? ? ? ? ? son = dad * 2 + 1;? ? ? ? }? ? }}void heap_sort(int arr[], int len) {? ? int i;? ? // 初始化,i從最後一個(gè)父節(jié)點(diǎn)開始調(diào)整? ? for (i = len / 2 - 1; i >= 0; i--)? ? ? ? max_heapify(arr, i, len - 1);? ? // 先將第一個(gè)元素和已排好元素前一位做交換,再重新調(diào)整,直到排序完畢? ? for (i = len - 1; i > 0; i--) {? ? ? ? swap(&arr[0], &arr[i]);? ? ? ? max_heapify(arr, 0, i - 1);? ? }}int main() {? ? int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };? ? int len = (int) sizeof(arr) / sizeof(*arr);? ? heap_sort(arr, len);? ? int i;? ? for (i = 0; i < len; i++)? ? ? ? printf("%d ", arr[i]);? ? printf(" ");? ? return 0;}C++實(shí)例 #include #include using namespace std;void max_heapify(int arr[], int start, int end) {? ? // 建立父節(jié)點(diǎn)指標(biāo)和子節(jié)點(diǎn)指標(biāo)? ? int dad = start;? ? int son = dad * 2 + 1;? ? while (son <= end) { // 若子節(jié)點(diǎn)指標(biāo)在範(fàn)圍內(nèi)才做比較? ? ? ? if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個(gè)子節(jié)點(diǎn)大小,選擇最大的? ? ? ? ? ? son++;? ? ? ? if (arr[dad] > arr[son]) // 如果父節(jié)點(diǎn)大於子節(jié)點(diǎn)代表調(diào)整完畢,直接跳出函數(shù)? ? ? ? ? ? return;? ? ? ? else { // 否則交換父子內(nèi)容再繼續(xù)子節(jié)點(diǎn)和孫節(jié)點(diǎn)比較? ? ? ? ? ? swap(arr[dad], arr[son]);? ? ? ? ? ? dad = son;? ? ? ? ? ? son = dad * 2 + 1;? ? ? ? }? ? }}void heap_sort(int arr[], int len) {? ? // 初始化,i從最後一個(gè)父節(jié)點(diǎn)開始調(diào)整? ? for (int i = len / 2 - 1; i >= 0; i--)? ? ? ? max_heapify(arr, i, len - 1);? ? // 先將第一個(gè)元素和已經(jīng)排好的元素前一位做交換,再從新調(diào)整(剛調(diào)整的元素之前的元素),直到排序完畢? ? for (int i = len - 1; i > 0; i--) {? ? ? ? swap(arr[0], arr[i]);? ? ? ? max_heapify(arr, 0, i - 1);? ? }}int main() {? ? int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };? ? int len = (int) sizeof(arr) / sizeof(*arr);? ? heap_sort(arr, len);? ? for (int i = 0; i < len; i++)? ? ? ? cout << arr[i] << ' ';? ? cout << endl;? ? return 0;}

參考文章:

https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/7.heapSort.md

https://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5%BA%8F

以下是熱心網(wǎng)友對(duì)堆排序算法的補(bǔ)充,僅供參考:

熱心網(wǎng)友提供的補(bǔ)充1:

上方又沒些 C# 的堆排序,艾孜爾江補(bǔ)充如下:

/// 
/// 堆排序
/// 
/// 待排序數(shù)組
static void HeapSort(int[] arr)
{
    int vCount = arr.Length;
    int[] tempKey = new int[vCount + 1];
    // 元素索引從1開始
    for (int i = 0; i < vCount; i++)
    {
        tempKey[i + 1] = arr[i];
    }
    // 初始數(shù)據(jù)建堆(從含最后一個(gè)結(jié)點(diǎn)的子樹開始構(gòu)建,依次向前,形成整個(gè)二叉堆)
    for (int i = vCount / 2; i >= 1; i--)
    {
        Restore(tempKey, i, vCount);
    }
    // 不斷輸出堆頂元素、重構(gòu)堆,進(jìn)行排序
    for (int i = vCount; i > 1; i--)
    {
        int temp = tempKey[i];
        tempKey[i] = tempKey[1];
        tempKey[1] = temp;
        Restore(tempKey, 1, i - 1);
    }
    //排序結(jié)果
    for (int i = 0; i < vCount; i++)
    {
        arr[i] = tempKey[i + 1];
    }
}
/// 
/// 二叉堆的重構(gòu)(針對(duì)于已構(gòu)建好的二叉堆首尾互換之后的重構(gòu))
/// 
/// 
/// 根結(jié)點(diǎn)j
/// 結(jié)點(diǎn)數(shù)
static void Restore(int[] arr, int rootNode, int nodeCount)
{
    while (rootNode <= nodeCount / 2) // 保證根結(jié)點(diǎn)有子樹
    {
        //找出左右兒子的最大值
        int m = (2 * rootNode + 1 <= nodeCount && arr[2 * rootNode + 1] > arr[2 * rootNode]) ? 2 * rootNode + 1 : 2 * rootNode;
        if (arr[m] > arr[rootNode])
        {
            int temp = arr[m];
            arr[m] = arr[rootNode];
            arr[rootNode] = temp;
            rootNode = m;
        }
        else
        {
            break;
        }
    }
}

熱心網(wǎng)友提供的補(bǔ)充2:

堆排序是不穩(wěn)定的排序!

既然如此,每次構(gòu)建大頂堆時(shí),在 父節(jié)點(diǎn)、左子節(jié)點(diǎn)、右子節(jié)點(diǎn)取三者中最大者作為父節(jié)點(diǎn)就行。我們追尋的只是最終排序后的結(jié)果,所以可以簡化其中的步驟。

我將個(gè)人寫的 Java 代碼核心放在下方,有興趣的同學(xué)可以一起討論下:

public int[] sort(int a[]) {
    int len = a.length - 1;    
    for (int i = len; i > 0; i--) {
        maxHeap(a, i);        
        //交換 跟節(jié)點(diǎn)root 與 最后一個(gè)子節(jié)點(diǎn)i 的位置        
        swap(a, 0, i);        
        //i--無序數(shù)組尺寸減少了 
    }  
    return a;
}

/**構(gòu)建一個(gè)大頂堆(完全二叉樹 ) 
* 從  最后一個(gè)非葉子節(jié)點(diǎn)  開始,若父節(jié)點(diǎn)小于子節(jié)點(diǎn),則互換他們兩的位置。然后依次從右至左,從下到上進(jìn)行! 
* 最后一個(gè)非葉子節(jié)點(diǎn),它的葉子節(jié)點(diǎn) 必定包括了最后一個(gè)(葉子)節(jié)點(diǎn),所以 最后一個(gè)非葉子節(jié)點(diǎn)是 a[(n+1)/2-1] 
 
* @param a 
* @param lastIndex 這個(gè)數(shù)組的最后一個(gè)元素 
*/
static void maxHeap(int a[], int lastIndex) {
    for (int i = (lastIndex + 1) / 2 - 1; i >= 0; i--) {
       //反正 堆排序不穩(wěn)定,先比較父與左子,大則交換;與右子同理。(不care 左子與右子位置是否變了!) 
        if (i * 2 + 1 <= lastIndex && a[i] < a[i * 2 + 1]) {
            swap(a, i, i * 2 + 1);        
        }    
        if (i * 2 + 2 <= lastIndex && a[i] < a[i * 2 + 2]) {
            swap(a, i, i * 2 + 2);        
        }
    }
}

private void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
以上為堆排序算法詳細(xì)介紹,插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等排序算法各有優(yōu)缺點(diǎn),用一張圖概括:

關(guān)于時(shí)間復(fù)雜度

平方階 (O(n2)) 排序 各類簡單排序:直接插入、直接選擇和冒泡排序。

線性對(duì)數(shù)階 (O(nlog2n)) 排序 快速排序、堆排序和歸并排序;

O(n1+§)) 排序,§ 是介于 0 和 1 之間的常數(shù)。 希爾排序

線性階 (O(n)) 排序 基數(shù)排序,此外還有桶、箱排序。

關(guān)于穩(wěn)定性

穩(wěn)定的排序算法:冒泡排序、插入排序、歸并排序和基數(shù)排序。

不是穩(wěn)定的排序算法:選擇排序、快速排序、希爾排序、堆排序。

名詞解釋:

n:數(shù)據(jù)規(guī)模

k:"桶"的個(gè)數(shù)

In-place:占用常數(shù)內(nèi)存,不占用額外內(nèi)存

Out-place:占用額外內(nèi)存

穩(wěn)定性:排序后 2 個(gè)相等鍵值的順序和排序之前它們的順序相同

文檔

堆排序是穩(wěn)定的排序算法

堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆積是一個(gè)近似完全二叉樹的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。堆排序可以說是一種利用堆的概念來排序的選擇排序。
推薦度:
為你推薦
資訊專欄
熱門視頻
相關(guān)推薦
快速排序算法原理 歸并排序算法c語言 數(shù)據(jù)結(jié)構(gòu)希爾排序流程圖 什么是選擇排序法 降序排序冒泡排序優(yōu)化 堆是一種什么排序方法 實(shí)現(xiàn)歸并排序利用的算法 希爾排序c 排序算法的一般選擇規(guī)則 冒泡排序流程圖 堆排序計(jì)算 歸并排序算法流程圖解 數(shù)據(jù)結(jié)構(gòu)希爾排序c語言 選擇排序算法例子 冒泡排序c語言 堆排序算法c語言 歸并排序算法原理 希爾排序又叫什么名字 選擇排序思想 java冒泡排序 桶排序java 冒泡排序法的基本思路 c語言選擇排序從小到大 希爾排序法是怎么排的 歸并排序怎么排 快速排序怎么排 堆排序思想 c語言桶式排序 冒泡法排序c語言編寫 選擇排序發(fā) 希爾排序代碼實(shí)現(xiàn) 歸并排序算法詳解 快速排序的詳細(xì)過程 堆排序代碼數(shù)據(jù)結(jié)構(gòu) 桶排序是什么意思 冒泡排序代碼 基數(shù)排序c 簡單選擇排序流程圖 希爾排序怎么排序 歸并排序的具體過程
Top 69堂国产成人免费视频_亚洲成人999_最新日韩中文字幕_97在线视频免费_91久久国产精品_欧美美女一区二区_亚洲a级在线观看_亚洲最大成人免费视频_av中文字幕不卡_一本色道久久综合亚洲精品按摩
亚洲国产精品影院| 欧美va亚洲va在线观看蝴蝶网| 久久精品久久99精品久久| 欧美亚洲愉拍一区二区| 国产精品美女一区二区三区| 成人午夜av在线| 亚洲男女一区二区三区| 中文字幕免费观看一区| 国产精品一级在线| 亚洲品质自拍视频| 欧美一区二区视频观看视频| 日韩欧美一二三四区| 琪琪久久久久日韩精品| 久久综合狠狠综合久久激情 | 国产一区二区三区香蕉 | 99精品一区二区三区| av色综合久久天堂av综合| 日韩美女视频一区| 欧美日韩亚洲综合一区| 国产传媒一区在线| 亚洲成人免费视| 欧美国产综合一区二区| 555www色欧美视频| 91小宝寻花一区二区三区| 欧美日韩一区二区欧美激情| 国产精品77777| 亚洲va欧美va人人爽| 中文字幕高清不卡| 欧美一级淫片007| 欧美中文字幕一区| 91在线小视频| 成人深夜视频在线观看| 久久精品国产第一区二区三区| 亚洲欧美国产三级| 国产婷婷色一区二区三区四区| 色婷婷综合激情| 成人黄色大片在线观看| 国内精品伊人久久久久av影院| 一区二区成人在线视频| 最新中文字幕一区二区三区| 精品国产免费久久 | 在线中文字幕一区| 99视频超级精品| 成人福利在线看| 国产激情视频一区二区在线观看| 日韩中文字幕一区二区三区| 午夜精品久久久久久久99水蜜桃| 亚洲裸体xxx| 亚洲色图丝袜美腿| 一区二区三区成人| 亚洲va中文字幕| 亚洲高清免费在线| 日韩精品免费专区| 极品销魂美女一区二区三区| 极品美女销魂一区二区三区免费| 国产一区在线精品| 成年人网站91| 欧美无乱码久久久免费午夜一区 | 国产成人免费视频精品含羞草妖精| 国产在线精品一区二区三区不卡 | 久久国产精品99久久人人澡| 久久精品99久久久| 精品国产三级a在线观看| 日韩一区二区三区免费观看| 日韩欧美一区二区视频| 久久综合九色综合欧美就去吻| 国产精品视频一二三| 一区二区三区美女| 久久99精品视频| 高清视频一区二区| 欧美三级电影网| 国产日韩欧美综合在线| 中文字幕免费不卡在线| 亚洲国产欧美日韩另类综合 | 成人小视频在线观看| 91久久精品网| 精品久久免费看| 亚洲人成影院在线观看| 天天射综合影视| 国产黄色精品视频| 欧美日韩精品专区| 欧美国产精品一区| 免费观看久久久4p| 日本韩国精品一区二区在线观看| 91精品国产免费| 一区二区激情小说| youjizz久久| 欧美成人在线直播| 亚洲一区二区三区视频在线| 国产高清精品在线| 欧美岛国在线观看| 日日欢夜夜爽一区| 欧美视频在线一区二区三区 | 亚洲精品视频在线| 老司机精品视频在线| 色噜噜狠狠成人中文综合| 日韩欧美一卡二卡| 亚洲永久精品国产| 一本大道综合伊人精品热热 | 欧美一区二区精品久久911| 亚洲少妇中出一区| 粉嫩av一区二区三区粉嫩| 亚洲精品一区二区三区香蕉| 奇米影视在线99精品| 欧美日韩国产一区| 一区二区三区精品久久久| 99久久精品国产观看| 国产精品美女久久久久久久久| 国产成人av一区二区三区在线观看| 欧美高清视频不卡网| 日韩1区2区3区| 精品精品国产高清a毛片牛牛 | 日韩一二三区不卡| 午夜视频在线观看一区二区 | 欧美一区二区啪啪| 免费成人在线播放| 精品久久人人做人人爱| 国产成人精品一区二区三区网站观看| 日韩免费观看2025年上映的电影| 免费欧美在线视频| 国产亚洲综合性久久久影院| 成人综合在线观看| 一区二区三区色| 制服丝袜亚洲色图| 国产精品小仙女| 亚洲另类色综合网站| 欧美一区二区视频网站| 国产一区二区三区在线观看精品| 国产欧美日韩麻豆91| 欧美日韩午夜精品| 久久99精品久久久久婷婷| 99re这里只有精品首页| 裸体一区二区三区| 91片在线免费观看| 91一区二区三区在线播放| 激情丁香综合五月| 91视频国产观看| 日韩一区欧美一区| 欧美亚洲动漫制服丝袜| 欧美日韩精品一区二区天天拍小说| 国产日产亚洲精品系列| 久久久欧美精品sm网站 | 青青草国产精品97视觉盛宴| 国产网站一区二区| 91麻豆精品国产91久久久更新时间 | 久久成人精品无人区| 最好看的中文字幕久久| 日韩一级在线观看| 在线精品视频一区二区三四| 精品一区二区国语对白| 亚洲欧美日韩国产另类专区| 久久久综合视频| 91精品国产综合久久福利| 97久久久精品综合88久久| 国产传媒日韩欧美成人| 免费观看日韩av| 亚洲bt欧美bt精品| 亚洲一区二区影院| 国产欧美一区二区三区沐欲| 日韩亚洲国产中文字幕欧美| 色诱视频网站一区| 91麻豆swag| 99re在线精品| av中文字幕一区| av在线不卡免费看| 成人免费毛片a| 国产精品一区二区久久精品爱涩| 捆绑调教美女网站视频一区| 日韩国产一区二| 精品一区二区在线免费观看| 国精产品一区一区三区mba视频| 视频一区中文字幕国产| 亚洲成人资源网| 一二三四区精品视频| 亚洲天堂免费在线观看视频| 国产精品电影一区二区三区| 国产精品久久久久久久久果冻传媒 | 欧美精品丝袜久久久中文字幕| 欧美丝袜自拍制服另类| 69久久夜色精品国产69蝌蚪网| 色狠狠av一区二区三区| 色八戒一区二区三区| 欧美性生活一区| 7777精品伊人久久久大香线蕉最新版| 欧美三级日韩三级国产三级| 91国偷自产一区二区使用方法| 欧美日韩一级视频| 精品国产一区二区三区av性色| 26uuu精品一区二区| 亚洲国产岛国毛片在线| 一区二区三区在线免费视频 | 日韩西西人体444www| 欧美一级黄色大片| 国产午夜亚洲精品午夜鲁丝片| 国产精品福利av| 日本在线播放一区二区三区| 国产精品中文有码| 777午夜精品免费视频| 亚洲欧美电影一区二区| 久久99精品国产91久久来源|