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

逛奔的蝸牛

我不聰明,但我會(huì)很努力

   ::  :: 新隨筆 ::  ::  :: 管理 ::

======================================基本思路======================================

1. SortListener 用來監(jiān)聽排序時(shí)數(shù)組中的數(shù)據(jù)已經(jīng)交換過等,當(dāng)監(jiān)聽事件發(fā)生時(shí),數(shù)組中的數(shù)據(jù)在SortPainter上更新繪制出來.

2. Sort 接口定義了排序的類需要實(shí)現(xiàn)的方法.

3. AbstractSort 實(shí)現(xiàn)了 Sort 接口,定義可共用的數(shù)據(jù)域和實(shí)現(xiàn)通用的方法.

4. 具體的排序算法 QuickSort, Bubble 等繼承AbstractSort.

5. SortPainter 繪制排序后的數(shù)組,實(shí)現(xiàn)了 SortListener 接口.

6. SortPainter 被加入到 SortWindow 中在窗口里顯示出來.


源碼: Sort.zip


======================================SortListener.ava======================================

 

package sort;


public interface SortListener {

    void dataSorted();

}


======================================Sort.java======================================

package sort;


public interface Sort {

    String getSortName();


    void sort();


    int getMaxValue();


    int getIndexOne();


    int getIndexTwo();


    int[] getSortingData();


    boolean isStopped();

    

    boolean isExchanged();

    

    void setExchanged(boolean exchanged);

    

    void addSortListener(SortListener sortListener);

}


======================================AbstractSort.java======================================

package sort;


//循環(huán)里sleep一次,交換元素sleep三次,賦值sleep一次

public abstract class AbstractSort implements Sort {

    protected int[] numbers; // 原始數(shù)據(jù): 為了能重現(xiàn)再次排序,所以保留原始數(shù)據(jù)

    protected int[] sortNumbers; // 正在排序的數(shù)組


    protected int indexOne;

    protected int indexTwo;


    protected int maxValue; // 數(shù)組中最大的值

    protected int delay = 500; // 時(shí)間間隔

    protected int exchangeDelay = delay * 4;

    protected boolean stopped = true;

    protected boolean exchanged = false;


    private SortListener sortListener;


    @Override

    public int getMaxValue() {

        return maxValue;

    }


    @Override

    public int getIndexOne() {

        return indexOne;

    }


    protected void setIndexOne(int index) {

        this.indexOne = index;

    }


    @Override

    public int getIndexTwo() {

        return indexTwo;

    }


    protected void setIndexTwo(int index) {

        this.indexTwo = index;

    }


    @Override

    public int[] getSortingData() {

        return sortNumbers;

    }


    @Override

    public boolean isStopped() {

        return stopped;

    }


    @Override

    public boolean isExchanged() {

        return exchanged;

    }


    @Override

    public void setExchanged(boolean exchanged) {

        this.exchanged = exchanged;

    }


    @Override

    public void addSortListener(SortListener sortListener) {

        this.sortListener = sortListener;

    }


    protected void init(int[] numbers, int delay) {

        this.delay = delay;

        this.exchangeDelay = delay * 3;

        this.numbers = new int[numbers.length];

        this.sortNumbers = new int[numbers.length];

        System.arraycopy(numbers, 0, this.numbers, 0, numbers.length);

        System.arraycopy(numbers, 0, this.sortNumbers, 0, numbers.length);


        this.maxValue = numbers[0];

        for (int i = 0; i < numbers.length; ++i) {

            if (numbers[i] > this.maxValue) {

                this.maxValue = numbers[i];

            }

        }

    }


    // 顯示排序后的數(shù)據(jù)

    protected void showSortedData() {

        if (sortListener != null) {

            sortListener.dataSorted();

        }

    }


    protected void reset() {

        // 從新初始化數(shù)組

        System.arraycopy(numbers, 0, sortNumbers, 0, numbers.length);

        stopped = false;

    }


    @Override

    abstract public void sort();

}


======================================BubbleSort.java======================================

package sort;


public class BubbleSort extends AbstractSort implements Runnable {

    public BubbleSort(int[] numbers, int delay) {

        init(numbers, delay);

    }


    @Override

    public String getSortName() {

        return "冒泡排序";

    }


    // 冒泡法排序

    @Override

    public void sort() {

        if (!stopped) { return; }

        reset();

        new Thread(this).start();

    }


    @Override

    public void run() {

        try {

            for (int i = sortNumbers.length - 1; i > 0; --i) {

                setIndexOne(i);


                for (int j = 0; j < i; ++j) {

                    if (sortNumbers[j] > sortNumbers[j + 1]) {

                        int temp = sortNumbers[j];

                        sortNumbers[j] = sortNumbers[j + 1];

                        sortNumbers[j + 1] = temp;


                        setExchanged(true);

                        showSortedData();

                        Thread.sleep(exchangeDelay);

                    }


                    setIndexTwo(j);

                    showSortedData();

                    Thread.sleep(delay);

                }

            }


            stopped = true;

            showSortedData();

        } catch (Exception e) {

        }

    }

}


======================================DoubleBubbleSort.java======================================

package sort;


public class DoubleBubbleSort extends AbstractSort implements Runnable {

    public DoubleBubbleSort(int[] numbers, int delay) {

        init(numbers, delay);

    }


    @Override

    public String getSortName() {

        return "雙向冒泡排序";

    }


    // 冒泡法排序

    @Override

    public void sort() {

        if (!stopped) { return; }

        reset();

        new Thread(this).start();

    }


    @Override

    public void run() {

        try {

            int left = 0;

            int right = sortNumbers.length - 1;


            // 如果算法第二行的某次內(nèi)循環(huán)沒有進(jìn)行元素交換,則說明排序工作已經(jīng)完成,可以退出外循環(huán).

            while (left < right) {

                // 向下

                setIndexOne(right);

                for (int i = left; i < right - 1; ++i) {

                    if (sortNumbers[i] > sortNumbers[i + 1]) {

                        int temp = sortNumbers[i];

                        sortNumbers[i] = sortNumbers[i + 1];

                        sortNumbers[i + 1] = temp;


                        setExchanged(true);

                        showSortedData();

                        Thread.sleep(exchangeDelay);

                    }


                    setIndexTwo(i);

                    showSortedData();

                    Thread.sleep(delay);

                }


                // 向上

                setIndexTwo(left);

                boolean end = true;

                for (int i = right; i > left; --i) {

                    if (sortNumbers[i] < sortNumbers[i - 1]) {

                        int temp = sortNumbers[i];

                        sortNumbers[i] = sortNumbers[i - 1];

                        sortNumbers[i - 1] = temp;

                        end = false;


                        setExchanged(true);

                        showSortedData();

                        Thread.sleep(exchangeDelay);

                    }


                    setIndexOne(i);

                    showSortedData();

                    Thread.sleep(delay);

                }


                if (end) {

                    break;

                }


                ++left;

                --right;


                showSortedData();

                Thread.sleep(delay);

            }


            stopped = true;

            showSortedData();


        } catch (Exception e) {

        }

    }

}


======================================InsertSort.java======================================

package sort;


public class InsertSort extends AbstractSort implements Runnable {

    public InsertSort(int[] numbers, int delay) {

        init(numbers, delay);

    }


    @Override

    public String getSortName() {

        return "插入排序";

    }


    /*

     * @Override protected void reset() { Arrays.fill(sortNumbers, 0); stopped =

     * false; }

     */


    // 冒泡法排序

    @Override

    public void sort() {

        if (!stopped) { return; }

        reset();

        new Thread(this).start();

    }


    @Override

    public void run() {

        try {

            for (int i = 0; i < sortNumbers.length; ++i) {

                setIndexOne(i);

                int temp = sortNumbers[i];

                int j = i;

                for (; j > 0; --j) {

                    setIndexTwo(j);

                    showSortedData();


                    if (sortNumbers[j - 1] > temp) {

                        sortNumbers[j] = sortNumbers[j - 1];


                        setExchanged(true);

                        showSortedData();

                        Thread.sleep(delay);

                    } else {

                        break;

                    }


                    Thread.sleep(delay);

                }


                sortNumbers[j] = temp;

                showSortedData();

                Thread.sleep(delay);

            }


            stopped = true;

            showSortedData();

        } catch (Exception e) {

        }

    }

}


======================================QuickSort.java======================================

package sort;


public class QuickSort extends AbstractSort implements Runnable {

    public QuickSort(int[] numbers, int delay) {

        init(numbers, delay);

    }


    @Override

    public String getSortName() {

        return "快速排序";

    }


    // 快速排序

    @Override

    public void sort() {

        if (!stopped) { return; }

        reset();

        new Thread(this).start();

    }


    @Override

    public void run() {

        try {

            quickSort(0, sortNumbers.length - 1);

            stopped = true;

            showSortedData();

        } catch (Exception e) {

        }

    }


    public void quickSort(int low, int height) throws InterruptedException {

        if (low < height) {

            int pivotLoc = partition(low, height);

            quickSort(low, pivotLoc - 1);

            quickSort(pivotLoc + 1, height);

        }

    }


    public int partition(int low, int height) throws InterruptedException {

        // 設(shè)置邊界

        setExchanged(true);

        setIndexOne(height);

        setIndexTwo(low);

        showSortedData();

        Thread.sleep(delay);


        int temp = sortNumbers[low];

        while (low < height) {

            while (low < height && sortNumbers[height] >= temp) {

                --height;

                showSortedData();

                Thread.sleep(delay);

            }

            sortNumbers[low] = sortNumbers[height];


            while (low < height && sortNumbers[low] <= temp) {

                ++low;

                showSortedData();

                Thread.sleep(delay);

            }

            sortNumbers[height] = sortNumbers[low];

            showSortedData();

            Thread.sleep(delay * 2);

        }

        sortNumbers[low] = temp;


        return low;

    }

}


======================================SelectSort.java======================================

package sort;


public class SelectSort extends AbstractSort implements Runnable {

    public SelectSort(int[] numbers, int delay) {

        init(numbers, delay);

    }


    @Override

    public String getSortName() {

        return "選擇排序";

    }


    // 選擇法排序

    @Override

    public void sort() {

        if (!stopped) { return; }

        reset();

        new Thread(this).start();

    }


    @Override

    public void run() {

        try {

            for (int i = sortNumbers.length - 1; i > 0; --i) {

                setIndexOne(i);

                int k = i;


                // 找到最小值

                for (int j = 0; j < i; ++j) {

                    if (sortNumbers[j] > sortNumbers[k]) {

                        k = j;

                        setExchanged(true);

                        showSortedData();

                        Thread.sleep(delay);

                    }


                    setIndexTwo(j);

                    showSortedData();

                    Thread.sleep(delay);

                }


                if (k != i) {

                    // 交換數(shù)據(jù)

                    int temp = sortNumbers[k];

                    sortNumbers[k] = sortNumbers[i];

                    sortNumbers[i] = temp;


                    setExchanged(true);

                    showSortedData();

                    Thread.sleep(exchangeDelay);

                }

            }


            stopped = true;

            showSortedData();

        } catch (Exception e) {

        }

    }

}


======================================GuiUtil.java======================================

package ui;


import java.awt.Component;

import java.awt.Dimension;

import java.awt.Toolkit;


public class GuiUtil {

    public static void center(Component frame) {

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        Dimension frameSize = frame.getSize();

        int x = (screenSize.width - frameSize.width) / 2;

        int y = (screenSize.height - frameSize.height) / 4;

        x = x >= 0 ? x : 0;

        y = y >= 0 ? y : 0;


        frame.setLocation(x, y);

    }

}


======================================SortPainter.java======================================

package ui;


import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Component;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.RenderingHints;

import java.util.List;

import java.util.concurrent.CopyOnWriteArrayList;


import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.SwingUtilities;


import sort.SortListener;

import sort.Sort;


@SuppressWarnings("serial")

public class SortPainter extends JPanel implements SortListener {

    private List<Sort> sorts;


    // 小球的顏色與下標(biāo)

    private Color[] ballColors = { Color.PINK, Color.CYAN, Color.MAGENTA };

    private int ballColorIndex;


    private int paddingX = 20; // 水平方向的邊距

    private int paddingY = 20; // 垂直方向的邊距

    private int lineDisY = 5; // 兩條線之間的垂直距離

    private int maxLineLength = 150; // 每條線最大的長度


    public SortPainter() {

        sorts = new CopyOnWriteArrayList<Sort>();

        setBackground(Color.BLACK);

    }


    public void addSort(final Sort sort) {

        sorts.add(sort);


        // 動(dòng)態(tài)的改變窗口大小

        Component com = SwingUtilities.getRoot(this);

        if (com != null) {

            int width = getWidth();

            int height = sort.getSortingData().length * lineDisY + 2 * paddingY;

            int neededWidth = sorts.size() * (maxLineLength + paddingX) + paddingX;

            if (width < neededWidth) {

                setMinimumSize(new Dimension(neededWidth, height));

                setPreferredSize(new Dimension(neededWidth, height));

            }


            ((JFrame) com).pack();

            GuiUtil.center(com);

        }

    }


    public List<Sort> getSorters() {

        return sorts;

    }


    @Override

    public void dataSorted() {

        repaint();

    }


    private int unifyLineLength(int value, int maxValue) {

        double rate = ((double) (value)) / maxValue;

        return (int) (maxLineLength * rate);

    }


    @Override

    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.setStroke(new BasicStroke(2));

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);


        int startX = paddingX;

        for (Sort s : sorts) {

            drawSortingData(g2d, s, startX, paddingY);

            startX += maxLineLength + paddingX;

        }

    }


    private void drawSortingData(Graphics2D g2d, Sort sorter, final int startX, final int startY) {

        int[] data = sorter.getSortingData();

        int indexOne = sorter.getIndexOne();

        int indexTwo = sorter.getIndexTwo();

        int length = 0;

        int maxValue = sorter.getMaxValue();


        // 繪制數(shù)組中的內(nèi)容

        g2d.setColor(Color.WHITE);

        int y = startY;

        for (int i = 0; i < data.length; ++i) {

            length = unifyLineLength(data[i], sorter.getMaxValue());

            g2d.drawLine(startX, y, startX + length, y);

            y += lineDisY;

        }


        // 繪制排序時(shí)的兩條分界線

        if (!sorter.isStopped()) {

            g2d.setColor(Color.GREEN);

            y = startY + indexTwo * lineDisY;

            length = unifyLineLength(data[indexTwo], maxValue);

            g2d.drawLine(startX, y, startX + length, y);


            g2d.setColor(Color.RED);

            y = startY + indexOne * lineDisY;

            length = unifyLineLength(data[indexOne], maxValue);

            g2d.drawLine(startX, y, startX + length, y);


            // 當(dāng)交換數(shù)據(jù)時(shí),使用小球閃爍顯示

            if (sorter.isExchanged()) {

                ballColorIndex = (ballColorIndex + 1) % ballColors.length;

                g2d.setColor(ballColors[ballColorIndex]);

                g2d.fillOval(startX - 8, startY + indexOne * lineDisY - 4, 8, 8);

                g2d.fillOval(startX - 8, startY + indexTwo * lineDisY - 4, 8, 8);

                sorter.setExchanged(false);

            }

        }

    }

}


 

======================================SortWindow.java======================================

package ui;


import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Random;


import javax.swing.Box;

import javax.swing.JButton;

import javax.swing.JFrame;


import sort.BubbleSort;

import sort.DoubleBubbleSort;

import sort.InsertSort;

import sort.QuickSort;

import sort.SelectSort;

import sort.Sort;


@SuppressWarnings("serial")

public class SortWindow extends JFrame {

    private SortPainter sortPainter;

    private Box buttonsBox;


    public SortWindow() {

        initGui();

        initData();

    }


    private void initGui() {

        sortPainter = new SortPainter();

        getContentPane().add(sortPainter, BorderLayout.CENTER);


        JButton sortAllButton = new JButton("全部一起排序");

        buttonsBox = Box.createHorizontalBox();

        buttonsBox.add(sortAllButton);

        buttonsBox.add(Box.createHorizontalGlue());

        getContentPane().add(buttonsBox, BorderLayout.SOUTH);


        sortAllButton.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                for (Sort s : sortPainter.getSorters()) {

                    s.sort();

                }

            }

        });

    }


    public void addSort(final Sort sort) {

        sortPainter.addSort(sort);

        sort.addSortListener(sortPainter);


        JButton sortButton = new JButton(sort.getSortName());

        buttonsBox.add(sortButton);


        validate();

        sortButton.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                sort.sort();

            }

        });

    }


    private void initData() {

        new Thread(new Runnable() {

            @Override

            public void run() {

                // 要排序的數(shù)組

                int maxValue = 1450;

                int[] numbers = new int[50];

                Random rand = new Random(System.currentTimeMillis());

                for (int i = 0; i < numbers.length; ++i) {

                    numbers[i] = rand.nextInt(maxValue) + 1;

                }


                int delay = 10; // 暫停時(shí)間


                // 雙向冒泡排序

                DoubleBubbleSort dbs = new DoubleBubbleSort(numbers, delay);

                addSort(dbs);


                // 冒泡排序

                BubbleSort bs = new BubbleSort(numbers, delay);

                addSort(bs);


                // 選擇排序

                SelectSort ss = new SelectSort(numbers, delay);

                addSort(ss);


                // 插入排序

                InsertSort is = new InsertSort(numbers, delay);

                addSort(is);


                // 快速排序

                QuickSort qs = new QuickSort(numbers, delay);

                addSort(qs);

            }

        }).start();

    }


    private static void createGuiAndShow() {

        // 顯示窗口

        JFrame frame = new SortWindow();

        frame.setSize(300, 450);

        GuiUtil.center(frame);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);

    }


    public static void main(String[] args) {

        createGuiAndShow();

    }

}

 

 

 

 

 

 

 

posted on 2010-12-30 06:50 逛奔的蝸牛 閱讀(1186) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Java

評(píng)論

# re: Java:圖形化比較排序 2010-12-31 01:01 閃電
太酷了,這是個(gè)很好的算法學(xué)習(xí)示例?。?nbsp; 回復(fù)  更多評(píng)論
  

# re: Java:圖形化比較排序 2013-11-23 22:36 微雨
特意來贊美下樓主,實(shí)在厲害。  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日本视频在线| 一本一本大道香蕉久在线精品| 1000精品久久久久久久久| 国产一区二区中文| 国产精品免费视频观看| 国产精品自拍视频| 一区二区三区在线免费观看| 黄色亚洲大片免费在线观看| 亚洲大片在线| 99国产精品久久久久久久| 亚洲精品美女| 午夜精品成人在线| 久久久免费精品视频| 久久精品国产99| 欧美成人四级电影| 99re6热在线精品视频播放速度| 亚洲激情六月丁香| 日韩视频―中文字幕| 午夜久久久久| 免费观看不卡av| 性色av香蕉一区二区| 亚洲一区二区三区精品视频| 亚洲一区二区三区三| 午夜精品免费| 另类av一区二区| 99精品福利视频| 欧美专区18| 欧美日本在线播放| 国产视频一区在线| 亚洲精品中文字| 久久成人综合视频| 亚洲激情成人| 校园春色综合网| 欧美成人精品一区二区| 国产精品人成在线观看免费| 在线播放中文一区| 亚洲欧美日韩一区二区在线 | 亚洲精品一区中文| 欧美一区久久| 亚洲激情网站免费观看| 亚洲精品之草原avav久久| 久久er精品视频| 国产精品国产一区二区| 亚洲高清视频在线观看| 亚洲欧美视频在线观看视频| 亚洲激情成人在线| 久久国产精彩视频| 国产精品区一区二区三| 亚洲国产午夜| 久久精品一区蜜桃臀影院| 99精品视频免费全部在线| 久久久亚洲人| 国产热re99久久6国产精品| 亚洲国产片色| 美国成人直播| 性色一区二区| 国产精品夜夜夜| 亚洲午夜免费福利视频| 蜜桃久久av一区| 久久精品在线| 亚洲系列中文字幕| 欧美日韩国产精品| 亚洲久久一区| 欧美成人免费网站| 老司机一区二区三区| 国产精品永久免费视频| 欧美一区二区三区免费视| 一区二区三区精品久久久| 欧美精品自拍| 在线中文字幕一区| 日韩午夜精品| 欧美性猛交xxxx乱大交退制版| 国产日韩精品在线播放| 欧美日韩极品在线观看一区| 亚洲高清网站| 美女久久一区| 欧美专区日韩视频| 久久人人精品| 狠狠久久亚洲欧美专区| 久久精品99久久香蕉国产色戒 | 在线免费观看视频一区| 美女图片一区二区| 久久久91精品国产一区二区精品| 国产精品久久久久毛片软件| 午夜激情综合网| 久久精品一区| 日韩午夜在线观看视频| 亚洲特黄一级片| 国产三区二区一区久久| 老鸭窝91久久精品色噜噜导演| 欧美成人午夜| 亚洲一区二区三区三| 久久精品亚洲乱码伦伦中文| 亚洲黄色天堂| 亚洲一区二区三区在线视频| 国内精品视频久久| 亚洲日本理论电影| 国产精品素人视频| 鲁大师成人一区二区三区| 久久精品一本久久99精品| 日韩一级精品| 亚洲一区影音先锋| 黄色精品在线看| 日韩视频在线播放| 蜜桃久久av| 新67194成人永久网站| 久久综合伊人| 欧美一级在线播放| 噜噜噜91成人网| 一区二区三区 在线观看视| 亚洲欧美综合精品久久成人 | 一本综合精品| 欧美夜福利tv在线| 一区二区三区 在线观看视频| 欧美一区二区三区视频| 激情久久久久久久| 亚洲永久免费视频| 99成人精品| 开心色5月久久精品| 在线亚洲欧美| 麻豆精品视频在线观看| 亚洲欧美综合v| 免费亚洲电影| 欧美一区二区三区成人| 国产精品sss| 亚洲精品中文字幕女同| 国内精品久久久| 亚洲桃色在线一区| 亚洲免费在线视频| 欧美特黄a级高清免费大片a级| 欧美激情亚洲视频| 在线电影一区| 久久久噜噜噜久久中文字幕色伊伊| 欧美在线中文字幕| 国产精品一区二区三区乱码| 亚洲四色影视在线观看| 国产精品影音先锋| 久久不见久久见免费视频1| 亚洲在线观看视频| 欧美日韩中文| 亚洲精品字幕| 亚洲天堂av在线免费| 欧美日韩免费高清一区色橹橹| 亚洲精品久久久久中文字幕欢迎你 | 亚洲天堂激情| 亚洲欧美高清| 欧美日韩激情网| 国产精品99久久久久久久女警 | 欧美国产一区二区| 亚洲黄色av一区| 欧美华人在线视频| 99re视频这里只有精品| 亚洲欧美三级在线| 亚洲一区二区在线免费观看| 午夜视频一区| 黄色工厂这里只有精品| 欧美国产第一页| 在线视频欧美日韩精品| 久久精品二区| 亚洲美女福利视频网站| 欧美日韩另类在线| 亚洲欧美在线看| 欧美高清视频免费观看| 亚洲天堂成人| 狠狠做深爱婷婷久久综合一区 | 欧美极品在线观看| 一本色道久久综合亚洲精品不| 欧美一级午夜免费电影| 在线视频国内自拍亚洲视频| 欧美精品成人一区二区在线观看| 99视频精品免费观看| 久久精品123| 亚洲美女免费精品视频在线观看| 欧美亚州韩日在线看免费版国语版| 欧美一区二区高清在线观看| 欧美v日韩v国产v| 亚洲视频大全| 尤物在线观看一区| 国产精品成人一区二区三区夜夜夜| 欧美一区二区三区的| 亚洲三级免费观看| 久久国产精品亚洲va麻豆| 亚洲精品九九| 国产一区二区丝袜高跟鞋图片 | 狂野欧美激情性xxxx| 亚洲精品一区二区三区婷婷月| 国产精品一区二区三区成人| 欧美激情中文字幕乱码免费| 久久精品亚洲国产奇米99| 亚洲私拍自拍| 亚洲精品一区二区三区在线观看| 玖玖精品视频| 久久成人精品| 午夜精品一区二区三区电影天堂 | 久久综合久色欧美综合狠狠| 亚洲国产欧美另类丝袜| 国产精品亚洲美女av网站| 欧美国产精品人人做人人爱| 欧美一区2区三区4区公司二百| 亚洲人成绝费网站色www|