日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python之十大经典排序算法的实现和原理

發(fā)布時(shí)間:2024/5/28 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之十大经典排序算法的实现和原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、冒泡排序

  • 冒泡排序(Bubble Sort)是一種比較簡(jiǎn)單的排序算法,它重復(fù)地走訪過(guò)要排序的元素,依次比較相鄰兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們調(diào)換過(guò)來(lái),直到?jīng)]有元素再需要交換,排序完成。
  • 冒泡排序的原理如下所示,數(shù)字表示的是數(shù)據(jù)序列原始的索引號(hào):

  • 算法過(guò)程:
    • 比較相鄰的元素,如果前一個(gè)比后一個(gè)大,就把它們兩個(gè)對(duì)調(diào)位置;
    • 對(duì)排序數(shù)組中每一對(duì)相鄰元素做同樣的工作,直到全部完成,此時(shí)最后的元素將會(huì)是本輪排序中最大的數(shù);
    • 對(duì)剩下的元素繼續(xù)重復(fù)以上的步驟,直到?jīng)]有任何一個(gè)元素需要比較;
    • 冒泡排序每次找出一個(gè)最大的元素,因此需要遍歷 n-1 次 (n 為數(shù)據(jù)序列的長(zhǎng)度)。
  • 算法特點(diǎn):
    • 什么時(shí)候最快(Best Cases):當(dāng)輸入的數(shù)據(jù)已經(jīng)是正序時(shí);
    • 什么時(shí)候最慢(Worst Cases):當(dāng)輸入的數(shù)據(jù)是反序時(shí)。
  • 實(shí)現(xiàn)示例:
def bubble_sort(lst):n = len(lst)for i in range(n):for j in range(1, n - i):if lst[j - 1] > lst[j]:lst[j - 1], lst[j] = lst[j], lst[j - 1]return lst

二、選擇排序

  • 選擇排序(Selection Sort)的原理,每一輪從待排序的記錄中選出最小的元素,存放在序列的起始位置,然后再?gòu)氖S嗟奈磁判蛟刂袑ふ业阶钚≡?#xff0c;然后放到已排序的序列的末尾。以此類推,直到全部待排序的數(shù)據(jù)元素的個(gè)數(shù)為零,得到數(shù)值從小到達(dá)排序的數(shù)據(jù)序列。
  • 也可以每一輪找出數(shù)值最大的元素,這樣的話,排序完畢后的數(shù)組最終是從大到小排列。選擇排序每次選出最小(最大)的元素,因此需要遍歷 n-1 次。
  • 選擇排序的原理如下:

  • 實(shí)現(xiàn)示例:
def selection_sort(lst):for i in range(len(lst) - 1): min_index = ifor j in range(i + 1, len(lst)):if lst[j] < lst[min_index]:min_index = j lst[i], lst[min_index] = lst[min_index], lst[i] return lst

三、快速排序

  • 快速排序(Quick Sort),是在上世紀(jì) 60 年代,由美國(guó)人東尼·霍爾提出的一種排序方法,這種排序方式,在當(dāng)時(shí)已經(jīng)是非常快的一種排序,因此在命名上,才將之稱為“快速排序”。
  • 算法過(guò)程:
    • 先從數(shù)據(jù)序列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù)(baseline,習(xí)慣取第一個(gè)數(shù));
    • 分區(qū)過(guò)程,將比基準(zhǔn)數(shù)小的數(shù)全放到它的左邊,大于或等于它的數(shù)全放到它的右邊;
    • 再對(duì)左右區(qū)間遞歸(recursive)重復(fù)第二步,直到各區(qū)間只有一個(gè)數(shù)。
  • 因?yàn)閿?shù)據(jù)序列之間的順序都是固定的,最后將這些子序列一次組合起來(lái),整體的排序就完成。
  • 如下所示,對(duì)于數(shù)據(jù)序列,先取第一個(gè)數(shù)據(jù) 15 為基準(zhǔn)數(shù),將比 15 小的數(shù)放在左邊,比 15 大(大于或等于)的數(shù)放在右邊:

  • 接下來(lái),對(duì)于左邊部分,重復(fù)上面的步驟,如下所示,取左邊序列的第一個(gè)數(shù)據(jù) 11 為基準(zhǔn)數(shù),將比 11 小的數(shù)放在左邊,比 11 大(大于或等于)的數(shù)放在右邊:

  • 繼續(xù)遞歸重復(fù)上述過(guò)程,直到每個(gè)區(qū)間只有一個(gè)數(shù),這樣就會(huì)完成排序。
  • 實(shí)現(xiàn)示例:
def quick_sort(lst): n = len(lst)if n <= 1:return lstbaseline = lst[0] left = [lst[i] for i in range(1, len(lst)) if lst[i] < baseline] right = [lst[i] for i in range(1, len(lst)) if lst[i] >= baseline]return quick_sort(left) + [baseline] + quick_sort(right)

四、歸并排序

  • 歸并排序(Merge Sort)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的一個(gè)非常典型的應(yīng)用,歸并排序?qū)蓚€(gè)已經(jīng)有序的子序列合并成一個(gè)有序的序列。
  • 算法流程:
    • 進(jìn)行序列拆分,一直拆分到只有一個(gè)元素;
    • 拆分完成后,開(kāi)始遞歸合并。
  • 思路:假設(shè)有一個(gè)沒(méi)有排好序的序列,那么首先使用拆分的方法將這個(gè)序列分割成一個(gè)個(gè)已經(jīng)排好序的子序列(直到剩下一個(gè)元素),然后再利用歸并方法將一個(gè)個(gè)有序的子序列合并成排好序的序列。
    • 拆分:
    • 對(duì)于數(shù)據(jù)序列 [15,11,13,18,10],從首先從數(shù)據(jù)序列的中間位置開(kāi)始拆分,中間位置的設(shè)置為 mid = n/2,首次拆分如下:

    • 第一次拆分后,依次對(duì)子序列進(jìn)行拆分,拆分過(guò)程如下:

  • 合并:
    • 合并過(guò)程中,對(duì)于左右分區(qū)以及其子區(qū)間,遞歸使用合并方法,先從左邊最小的子區(qū)間開(kāi)始,對(duì)于每個(gè)區(qū)間,依次將最小的數(shù)據(jù)放在最左邊,然后對(duì)右邊區(qū)間也執(zhí)行同樣的操作。
    • 合并過(guò)程如下:

  • 實(shí)現(xiàn)示例:
def merge_sort(lst):def merge(left,right):i = 0j = 0 result = [] while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i])i += 1else:result.append(right[j])j += 1result = result + left[i:] + right[j:]return resultn = len(lst)if n <= 1: return lst mid = n // 2 left = merge_sort(lst[:mid])right = merge_sort(lst[mid:])return merge(left,right)

五、堆排序

① 堆的定義

  • 對(duì)于 n 個(gè)元素的數(shù)據(jù)序列,當(dāng)且僅當(dāng)滿足下列情形之一時(shí),才稱之為堆。
    • 情形 1:

    • 情形 2:

  • 若序列 {k0, k1, k2, k3, …, kn-1} 是堆,則堆頂元素必為序列中n個(gè)元素的最小值或最大值。
    • 小頂堆如下圖所示:

    • 大頂堆如下圖所示:

  • 若在輸出堆頂?shù)淖钚≈?#xff08;或最大值)之后,使得剩余 n-1 個(gè)元素的序列重又建成一個(gè)堆,則得到 n 個(gè)元素的次小值(或次大值)。如此反復(fù)執(zhí)行,便能得到一個(gè)有序序列,這個(gè)過(guò)程稱之為“堆排序”。

② 堆的存儲(chǔ)

  • 一般用數(shù)組來(lái)表示堆,若根結(jié)點(diǎn)存在序號(hào) 0 處, i 結(jié)點(diǎn)的父結(jié)點(diǎn)下標(biāo)就為 (i-1)/2,i 結(jié)點(diǎn)的左右子結(jié)點(diǎn)下標(biāo)分別為 2i+1 和 2i+2 。
  • 對(duì)于上面提到的小頂堆和大頂堆,其數(shù)據(jù)存儲(chǔ)情況如下(圖中右邊為其數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),左邊為其邏輯結(jié)構(gòu)):


③ 堆排序

  • 實(shí)現(xiàn)堆排序需要解決兩個(gè)問(wèn)題:
    • 如何由一個(gè)無(wú)序序列建成一個(gè)堆?
    • 如何在輸出堆頂元素之后,調(diào)整剩余元素成為一個(gè)新的堆?
  • 堆的初始化:
    • 第一個(gè)問(wèn)題實(shí)際上就是堆的初始化,那么如何構(gòu)造初始堆呢?假設(shè)初始的數(shù)據(jù)序列如下:

    • 需要將其以樹(shù)形結(jié)構(gòu)來(lái)展示,如下:

    • 初始化堆的時(shí)候是對(duì)所有的非葉子結(jié)點(diǎn)進(jìn)行篩選,最后一個(gè)非終端元素的下標(biāo)是 [n/2] 向下取整,所以篩選只需要從第 [n/2] 向下取整個(gè)元素開(kāi)始,從后往前進(jìn)行調(diào)整。
    • 從最后一個(gè)非葉子結(jié)點(diǎn)開(kāi)始,每次都是從父結(jié)點(diǎn)、左邊子節(jié)點(diǎn)、右邊子節(jié)點(diǎn)中進(jìn)行比較交換,交換可能會(huì)引起子結(jié)點(diǎn)不滿足堆的性質(zhì),所以每次交換之后需要重新對(duì)被交換的子結(jié)點(diǎn)進(jìn)行調(diào)整。
    • 以小頂堆為例,構(gòu)造初始堆的過(guò)程如下:

  • 進(jìn)行堆排序:
    • 有了初始堆之后就可以進(jìn)行排序,堆排序是一種選擇排序,建立的初始堆為初始的無(wú)序區(qū);
    • 排序開(kāi)始,首先輸出堆頂元素(因?yàn)樗亲钪?#xff09;,將堆頂元素和最后一個(gè)元素交換,這樣第 n 個(gè)位置(即最后一個(gè)位置)作為有序區(qū),前 n-1 個(gè)位置仍是無(wú)序區(qū),對(duì)無(wú)序區(qū)進(jìn)行調(diào)整,得到堆之后,再交換堆頂和最后一個(gè)元素,這樣有序區(qū)長(zhǎng)度變?yōu)?2;
    • 大頂堆:

    • 交換堆頂元素和最后的元素:

    • 無(wú)序區(qū) -1,有序區(qū) +1:

    • 不斷進(jìn)行此操作,將剩下的元素重新調(diào)整為堆,然后輸出堆頂元素到有序區(qū),每次交換都導(dǎo)致無(wú)序區(qū) -1,有序區(qū) +1,不斷重復(fù)此過(guò)程直到有序區(qū)長(zhǎng)度增長(zhǎng)為 n-1,排序完成。
  • 實(shí)現(xiàn)示例:
def heap_sort(lst):def adjust_heap(lst, i, size):left_index = 2 * i + 1right_index = 2 * i + 2largest_index = i if left_index < size and lst[left_index] > lst[largest_index]: largest_index = left_index if right_index < size and lst[right_index] > lst[largest_index]: largest_index = right_index if largest_index != i: lst[largest_index], lst[i] = lst[i], lst[largest_index] adjust_heap(lst, largest_index, size)def built_heap(lst, size):for i in range(len(lst)//2)[::-1]: adjust_heap(lst, i, size) size = len(lst)built_heap(lst, size) for i in range(len(lst))[::-1]: lst[0], lst[i] = lst[i], lst[0]adjust_heap(lst, 0, i) return lst

六、插入排序

  • 插入排序(Insertion Sort)就是每一步都將一個(gè)需要排序的數(shù)據(jù)按其大小插入到已經(jīng)排序的數(shù)據(jù)序列中的適當(dāng)位置,直到全部插入完畢。
  • 如下所示,插入排序如同打撲克牌一樣,每次將后面的牌插到前面已經(jīng)排好序的牌中:

  • 實(shí)現(xiàn)示例:
def insertion_sort(lst):for i in range(len(lst) - 1):cur_num, pre_index = lst[i+1], iwhile pre_index >= 0 and cur_num < lst[pre_index]:lst[pre_index + 1] = lst[pre_index]pre_index -= 1lst[pre_index + 1] = cur_num return lst

七、希爾排序

  • 希爾排序(Shell Sort)是插入排序的一種更高效率的實(shí)現(xiàn),核心在于間隔序列的設(shè)定,既可以提前設(shè)定好間隔序列,也可以動(dòng)態(tài)的定義間隔序列。
  • 以動(dòng)態(tài)間隔序列為例來(lái)描述,初始間隔(gap 值)為數(shù)據(jù)序列長(zhǎng)度除以 2 取整,后續(xù)間隔以前一個(gè)間隔數(shù)值除以 2 取整為循環(huán),直到最后一個(gè)間隔值為 1。
  • 對(duì)于下面這個(gè)數(shù)據(jù)序列,初始間隔數(shù)值為 5:

  • 先將數(shù)據(jù)序列按間隔進(jìn)行子序列分組,第一個(gè)子序列的索引為 [0,5,10],這里分成 5 組:

  • 為方便大家區(qū)分不同的子序列,對(duì)同一個(gè)子序列標(biāo)注相同的顏色,分組情況如下:

  • 分組結(jié)束后,子序列內(nèi)部進(jìn)行插入排序,gap 為 5 的子序列內(nèi)部排序后如下:

  • 子序列內(nèi)部排序后的狀態(tài),如下所示:

  • 接下來(lái)選取第二個(gè)間隔值,按照間隔值進(jìn)行子序列分組,同樣地,子序列內(nèi)部分別進(jìn)行插入排序;如果數(shù)據(jù)序列比較長(zhǎng),則會(huì)選取第 3 個(gè)、第 4 個(gè)或者更多個(gè)間隔值,重復(fù)上述的步驟:

  • gap 為 2 的排序情況前后對(duì)照如下:

  • 最后一個(gè)間隔值為 1,這一次相當(dāng)于簡(jiǎn)單的插入排序,但是經(jīng)過(guò)前幾次排序,序列已經(jīng)基本有序,因此最后一次排序時(shí)間效率就提高了很多:

  • 實(shí)現(xiàn)示例:
def shell_sort(lst):n = len(lst)gap = n // 2while gap > 0:for i in range(gap, n):for j in range(i, gap - 1, -gap):if lst[j] < lst[j - gap]:lst[j], lst[j - gap] = lst[j - gap], lst[j]else:breakgap //= 2return lst

八、計(jì)數(shù)排序

  • 計(jì)數(shù)排序(Counting Sort)的核心在于將輸入的數(shù)據(jù)值轉(zhuǎn)化為鍵,存儲(chǔ)在額外開(kāi)辟的數(shù)組空間中,計(jì)數(shù)排序要求輸入的數(shù)據(jù)必須是有確定范圍的整數(shù)。
  • 算法的步驟如下:
    • 先找出待排序的數(shù)組中最大和最小的元素,新開(kāi)辟一個(gè)長(zhǎng)度為最大值-最小值 +1 的數(shù)組;

    • 然后,統(tǒng)計(jì)原數(shù)組中每個(gè)元素出現(xiàn)的次數(shù),存入到新開(kāi)辟的數(shù)組中;

  • 接下來(lái),根據(jù)每個(gè)元素出現(xiàn)的次數(shù),按照新開(kāi)辟數(shù)組中從小到大的秩序,依次填充到原來(lái)待排序的數(shù)組中,完成排序:

  • 實(shí)現(xiàn)示例:
def counting_sort(lst):nums_min = min(lst)bucket = [0] * (max(lst) + 1 - nums_min)for num in lst:bucket[num - nums_min] += 1i = 0for j in range(len(bucket)):while bucket[j] > 0:lst[i] = j + nums_minbucket[j] -= 1i += 1return lst

九、桶排序

① 基本思想

  • 簡(jiǎn)單來(lái)說(shuō),桶排序(Bucket Sort)就是把數(shù)據(jù)分組,放在一個(gè)個(gè)的桶中,對(duì)每個(gè)桶里面的數(shù)據(jù)進(jìn)行排序,然后將桶進(jìn)行數(shù)據(jù)合并,完成桶排序。該算法分為四步,包括劃分桶、數(shù)據(jù)入桶、桶內(nèi)排序、數(shù)據(jù)合并。
  • 桶的劃分過(guò)程:
    • 對(duì)于一個(gè)數(shù)值范圍在 10 到 49 范圍內(nèi)的數(shù)組,取桶的大小為 10 (defaultBucketSize = 10),則第一個(gè)桶的范圍為 10 到 20,第二個(gè)桶的數(shù)據(jù)范圍是 20 到 30,依次類推;

    • 最后一共需要 4 個(gè)桶來(lái)放入數(shù)據(jù):

② 排序過(guò)程

  • 對(duì)于下面這個(gè)數(shù)據(jù)序列,初始設(shè)定桶的大小為 20 (defaultBucketSize = 20),經(jīng)計(jì)算一共需要 4 個(gè)桶來(lái)放入數(shù)據(jù):

  • 然后將原始數(shù)組按數(shù)值大小放入到對(duì)應(yīng)的桶中,完成數(shù)據(jù)分組:

  • 對(duì)于桶內(nèi)的數(shù)據(jù)序列,這時(shí)可以用冒泡排序、選擇排序等多種排序算法來(lái)對(duì)數(shù)據(jù)進(jìn)行排序。可以選用冒泡排序來(lái)對(duì)桶內(nèi)數(shù)據(jù)進(jìn)行排序:

  • 桶內(nèi)排序完成后,將數(shù)據(jù)按桶的順序進(jìn)行合并,這樣就得到所有數(shù)值排好序的數(shù)據(jù)序列:

  • 實(shí)現(xiàn)示例:
def bucket_sort(lst, defaultBucketSize=4):maxVal, minVal = max(lst), min(lst)bucketSize = defaultBucketSizebucketCount = (maxVal - minVal) // bucketSize + 1 buckets = [[] for i in range(bucketCount)]for num in lst:buckets[(num - minVal) // bucketSize].append(num)lst.clear() for bucket in buckets:bubble_sort(bucket) lst.extend(bucket)return lst

十、基數(shù)排序

① 基本思想

  • 基數(shù)排序(radix sort)屬于“分配式排序”(distribution sort),它是透過(guò)鍵值的部份信息,將要排序的元素分配至某些“桶”中,以達(dá)到排序的作用。基數(shù)排序適用于所有元素均為正整數(shù)的數(shù)組。
  • 排序過(guò)程分為“分配”和“收集”,排序過(guò)程中,將元素分層為多個(gè)關(guān)鍵碼進(jìn)行排序(一般按照數(shù)值的個(gè)位、十位、百位、…… 進(jìn)行區(qū)分),多關(guān)鍵碼排序按照從最主位關(guān)鍵碼到最次位關(guān)鍵碼或從最次位到最主位關(guān)鍵碼的順序逐次排序。
  • 基數(shù)排序的方式可以采用最低位優(yōu)先 LSD(Least sgnificant digital)法或最高位優(yōu)先 MSD(Most sgnificant digital)法,LSD 的排序方式由鍵值的最右邊開(kāi)始,而 MSD 則相反,由鍵值的最左邊開(kāi)始。
  • LSD 的基數(shù)排序適用于位數(shù)小的數(shù)列,如果位數(shù)多的話,使用 MSD 的效率會(huì)比較好,MSD 的方式恰與 LSD 相反,是由高位數(shù)為基底開(kāi)始進(jìn)行分配,其它的演算方式則都相同。

② 算法流程

  • 以最低位優(yōu)先 LSD 為例:
    • 先根據(jù)個(gè)位數(shù)的數(shù)值,在掃描數(shù)值時(shí)將它們分配至編號(hào) 0 到 9 的桶中,然后將桶子中的數(shù)值串接起來(lái):


    • 將這些桶子中的數(shù)值重新串接起來(lái),成為新的序列,接著再進(jìn)行一次分配,這次是根據(jù)十位數(shù)來(lái)分配:


  • 如果排序的對(duì)象有三位數(shù)以上,則持續(xù)進(jìn)行以上的動(dòng)作直至最高位數(shù)為止。
  • 實(shí)現(xiàn)示例:
# LSD Radix Sort def radix_sort(lst):mod = 10div = 1mostBit = len(str(max(lst))) buckets = [[] for row in range(mod)] while mostBit:for num in lst: buckets[num // div % mod].append(num)i = 0 for bucket in buckets: while bucket:lst[i] = bucket.pop(0)i += 1div *= 10mostBit -= 1return lst

總結(jié)

以上是生活随笔為你收集整理的Python之十大经典排序算法的实现和原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产美女又黄又爽又色视频免费 | 亚洲av无码国产精品永久一区 | 日本三级一区二区 | 国产做爰免费观看 | 国产主播一区二区 | 欧美国产一区二区 | 久久草视频 | 性感美女一级片 | 激情六月天 | 色视频网站在线观看 | 日韩欧美一区二区三区免费观看 | 亚洲精华国产精华精华液网站 | 中文字幕av一区 | 免费激情小视频 | 四虎免费视频 | 亚洲精品乱码久久久久久国产主播 | 九九九免费 | 成年人免费黄色片 | 久久国内精品视频 | 天堂国产精品 | 不卡中文一二三区 | 天堂色区 | 亚洲最大福利视频网 | 国产精品av在线免费观看 | 亚洲狼人伊人 | 免费一级全黄少妇性色生活片 | 天天干,夜夜操 | 国产女主播一区二区三区 | 国产一二三视频 | 性欧美videossex精品 | 国产综合99| 五个女闺蜜把我玩到尿失禁 | 国产乱淫a∨片免费视频 | 国产a三级 | 欧美色图校园春色 | 婷婷777 | 理论片第一页 | 男女午夜视频在线观看 | 日日噜噜噜夜夜爽爽狠狠 | 亚洲人成在线观看 | 国产乱码久久久 | 亚洲一区二区三区四区五区午夜 | 久久久国产精品黄毛片 | 性歌舞团一区二区三区视频 | 国产精品午夜福利 | 国产欧美一区二区三区精品酒店 | 欧美激情国产一区 | 毛色毛片 | 四虎一级片 | 欧美日韩一区二区在线观看视频 | 一区二区三区在线免费播放 | 一本一道久久 | 亚洲天堂激情 | 国产人妻精品一区二区三 | 亚洲美女性视频 | 亚洲av无码不卡一区二区三区 | 国产人与zoxxxx另类 | 久久午夜av | 99re6在线精品视频免费播放 | 国产成人毛片 | 狠狠爱综合 | 国产又粗又黄又猛 | 国产青青草视频 | 蜜桃视频在线观看一区二区 | 久草日韩| 天堂资源网| 国产一区二区四区 | 深夜视频在线观看 | 中文日本在线 | 日韩a级大片 | 6699嫩草久久久精品影院 | 成人听书哪个软件好 | 国模二区| 中国精品一区二区 | 欧美精品韩国精品 | 国产在线天堂 | 懂色av,蜜臀av粉嫩av | 中文字幕亚洲精品在线观看 | 日本高清视频www | 国产一区二区在线免费 | 成人爱爱免费视频 | 亚洲国产aⅴ精品一区二区的游戏 | 久久久久亚洲无码 | 综合精品视频 | 国产1区2区在线观看 | 一本色道久久加勒比精品 | 国产天堂 | 亚洲精品一区三区三区在线观看 | 色综合天天色 | 日本熟妇色xxxxx日本免费看 | av福利影院| 一级久久 | 黑人玩弄人妻一区二区三区 | 天堂…中文在线最新版在线 | 国产九一精品 | 国产femdom调教7777 | 国产又爽又黄的视频 | 丰满人妻一区二区 | 91欧美在线视频 |