<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 7, comments - 17, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    最近從《java中的快速排序算法》看到了一個(gè)快速排序的實(shí)現(xiàn),實(shí)際上手測(cè)試了下。然后發(fā)現(xiàn)原算法有重復(fù),便優(yōu)化了一下。另外,自己實(shí)現(xiàn)了非遞歸的算法。
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Stack;

    public class QSort {

        
    /**
         * 
    @author WangYu 2008-05-29 初始
         * 
    @param pData
         *            需要排序的數(shù)組
         * 
    @param left
         *            左邊的位置,初始值為0
         * 
    @param length
         *            右邊的位置,初始值為數(shù)組長(zhǎng)度
         
    */

        
    public static void quickSort(int[] pData, int left, int right) {
            
    int i, j;
            
    int middle, temp;
            i 
    = left;
            j 
    = right;
            middle 
    = pData[left];
            
    while (true) {
                
    while ((++i) < right - 1 && pData[i] < middle)
                    ;
                
    while ((--j) > left && pData[j] > middle)
                    ;
                
    if (i >= j)
                    
    break;
                temp 
    = pData[i];
                pData[i] 
    = pData[j];
                pData[j] 
    = temp;
            }
            pData[left] 
    = pData[j];
            pData[j] 
    = middle;

            System.out.print(
    "分界值:" + middle + "  下標(biāo)" + j + "");
            
    for (int k = 0; k < pData.length; k++) {
                System.out.print(pData[k] 
    + " ");
            }
            System.out.println();

            
    if (left < j)
                quickSort(pData, left, j);

            
    if (right > i)
                quickSort(pData, i, right);
        }

        
    /**
         * 
    @author ardorleo 2010-11-21 快速排序優(yōu)化后的遞歸實(shí)現(xiàn)
         * 
    @param pData
         *            需要排序的數(shù)組
         * 
    @param left
         *            左邊的位置,初始值為0
         * 
    @param length
         *            右邊的位置,初始值為數(shù)組長(zhǎng)度
         
    */
        
    public static void qSort1(int[] pData, int left, int length) {
            
    int i, j;
            
    int middle, temp;
            i 
    = left;
            j 
    = length;
            middle 
    = pData[left];

            
    while (true) {// 在循環(huán)體中,middle只用做比較,但值保持不變
                while ((++i) < length - 1 && pData[i] < middle)
                    ;

                
    while ((--j) > left && pData[j] > middle)
                    ;

                
    if (i >= j)
                    
    break;
                temp 
    = pData[i];
                pData[i] 
    = pData[j];
                pData[j] 
    = temp;
            }

            
    // 較小的值在左,較大的值右
            pData[left] = pData[j];
            pData[j] 
    = middle;

            System.out.print(
    "分界值:" + middle + "  下標(biāo)" + j + "");
            
    for (int k = 0; k < pData.length; k++) {
                System.out.print(pData[k] 
    + " ");
            }
            System.out.println();

            
    // 此種條件可以避免多余排序(每一趟最后兩個(gè)相鄰已比較后,就不用再遞歸了)
            if (j - left > 1)
                qSort1(pData, left, j);

            
    if (length - i > 1)
                qSort1(pData, i, length);

        }

        
    /**
         * 
    @author ardorleo 2010-11-21 快速排序的非遞歸實(shí)現(xiàn)
         * 
    @param pData
         *            需要排序的數(shù)組
         * 
    @param left
         *            左邊的位置,初始值為0
         * 
    @param length
         *            右邊的位置,初始值為數(shù)組長(zhǎng)度
         
    */
        
    public static void qsort2(int[] pData, int orignal_start, int orignal_length) {
            
    int temp;
            
    int start = orignal_start;
            
    int length = orignal_length;
            
    int left = orignal_start;
            
    int right = orignal_length;
            
    int reference = pData[left];

            Stack
    <Integer> intStack = new Stack<Integer>();
            
    while (true) {
                
    while (true) {
                    
    while ((++left) < length - 1 && pData[left] < reference)
                        ;

                    
    while ((--right) > start && pData[right] > reference)
                        ;

                    
    if (left >= right)
                        
    break;

                    temp 
    = pData[left];
                    pData[left] 
    = pData[right];
                    pData[right] 
    = temp;
                }
                pData[start] 
    = pData[right];
                pData[right] 
    = reference;

                System.out.print(
    "分界值:" + reference + "  下標(biāo):" + right+ " 當(dāng)前順序: ");
                
    for (int k = 0; k < pData.length; k++) {
                    System.out.print(pData[k] 
    + " ");
                }
                System.out.println();

                
    //分值左邊排序
                if (right > start + 1) {
                    intStack.push(length);
                    length 
    = right;
                    left 
    = start;
                }
                
                
    //分值右邊排序
                while (length <= left + 1 && !intStack.empty()) {
                    
    int tempLength = intStack.pop();
                    left 
    = length + 1;
                    length 
    = tempLength;
                }
                
    if (length > left + 1) {
                    start 
    = left;
                    right 
    = length;
                }
        
                
    //結(jié)束條件
                if (intStack.empty() && length <= left + 1)
                    
    break;
                
                
    //left值有可能大于下標(biāo)最大值
                reference = pData[left];
            }

        }

        
    public static void main(String[] args) {
            
    int[] pData = new int[10];
            
    for (int i = 0; i < 10; i++) {
                pData[i] 
    = (int) (Math.random() * 100);
            }

            System.out.print(
    "數(shù)組原始序列:");
            
    for (int i = 0; i < pData.length; i++)
                System.out.print(pData[i] 
    + " ");
            System.out.println(
    "\n***********************");
            QSort.qsort2(Arrays.copyOf(pData, pData.length), 
    0, pData.length);
            System.out.println(
    "***********************");
            QSort.qSort1(Arrays.copyOf(pData, pData.length), 
    0, pData.length);
            System.out.println(
    "***********************");
            QSort.quickSort(Arrays.copyOf(pData, pData.length), 
    0, pData.length);
        }

    }

    主站蜘蛛池模板: 本道天堂成在人线av无码免费| 亚洲手机中文字幕| 老司机午夜在线视频免费观 | 国产免费黄色无码视频| 日本特黄特色aa大片免费| 天堂亚洲国产中文在线| 永久免费AV无码国产网站| 色偷偷亚洲女人天堂观看欧| 亚洲啪啪免费视频| 亚洲伊人久久大香线蕉啊| 日本黄网站动漫视频免费| 亚洲成a人片在线观看中文!!!| 国产精品色拉拉免费看| 亚洲免费视频播放| 天天天欲色欲色WWW免费| 亚洲AV成人无码网站| 亚洲国产成人精品无码久久久久久综合 | 免费久久人人爽人人爽av| 亚洲精品无码久久千人斩| 国产免费无码AV片在线观看不卡 | 亚洲av片劲爆在线观看| 麻豆视频免费播放| 在线精品亚洲一区二区| 免费国产综合视频在线看 | 国产91成人精品亚洲精品| 亚洲国产综合人成综合网站| 国产乱妇高清无乱码免费| 亚洲今日精彩视频| 女人被弄到高潮的免费视频| 精品一区二区三区免费毛片| 亚洲色偷偷综合亚洲AVYP| 久久99热精品免费观看牛牛| 亚洲一区二区三区久久| 国产亚洲精品免费| 97无码人妻福利免费公开在线视频 | 亚洲影视自拍揄拍愉拍| 国产一级特黄高清免费大片| 三级毛片在线免费观看| 亚洲乱码一二三四区麻豆| 亚洲国产av一区二区三区| 99久久99久久精品免费观看|