第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復(fù) n 值較大的快速排序算法?(當(dāng)數(shù)組不是隨機的)

如何修復(fù) n 值較大的快速排序算法?(當(dāng)數(shù)組不是隨機的)

拉風(fēng)的咖菲貓 2022-09-07 17:49:29
我的快速排序算法對于較大的 n 值失敗,并且僅當(dāng)數(shù)組不是隨機的。我嘗試過在各種數(shù)組上使用該算法。當(dāng)我使用隨機數(shù)字?jǐn)?shù)組(對于n的任何值)時,它可以正常工作,但是對于包含相同值或按升序或降序排列的值的數(shù)組,它失敗了。這也只有在n大約是abov 6000時。(當(dāng)n為<5000時,它可以完美地工作)我已經(jīng)嘗試過使用不同版本的快速排序。一個使用while循環(huán)而不是遞歸,并且它工作得很好。就像我說過的,只有當(dāng)n對于非隨機化數(shù)組大于6000時,我的算法才會失敗,對于5000或更低,它的效果很好。void quicksort(int a[], int low, int high) {        if (low < high) {            int index = partition(a, low, high); // error             quicksort(a, low, index - 1);  // error            quicksort(a, index + 1, high);        }    }int partition(int arr[], int low, int high) {        int pivot = arr[high];        int i = low - 1;        //int j = low;        for (int j = low; j < high; j++) {            // If current element is smaller than or             // equal to pivot             if (arr[j] <= pivot) {                i++;                // swap arr[i] and arr[j]                 int temp = arr[i];                arr[i] = arr[j];                arr[j] = temp;            }        }        int temp = arr[i + 1];        arr[i + 1] = arr[high];        arr[high] = temp;        return (i + 1);    }上面我有我的快速排序算法。對于 n>6000(以及數(shù)組不是隨機的)而失敗的那個。下面是適用于 n 的所有值和任何類型的數(shù)組的代碼。     public void quicksort(int[] data, int low, int high)   {  // 1 or 0 items are sorted by default      if(high - low < 1)         return;      int left = low;      int right = high;      int pivot = data[low + (high - low) / 2];        while(left <= right)      {  // Increment left pointer until left >= pivot         while(data[left] < pivot)            left++;         // Increment right pointer until right <= pivot         while(data[right] > pivot)            right--;         // If left < right; swap values         if(left <= right)         {  int temp = data[left];            data[left] = data[right];            data[right] = temp;            left++;            right--;         }      }      // quick_sort 'lesser values'      quicksort(data, low, right);      // quick_sort 'greater values'      quicksort(data, left, high);   }終端專門在兩行中顯示錯誤。(我在第一個快速排序方法中標(biāo)記為錯誤的行)。
查看完整描述

1 回答

?
互換的青春

TA貢獻1797條經(jīng)驗 獲得超6個贊

如果數(shù)據(jù)已經(jīng)按順序排列,則使用 arr[high](或 arr[low])會導(dǎo)致最壞情況下的堆棧空間開銷為 O(n),這會溢出堆棧。第二個示例使用中間元素 (arr[low +(高-低)/2]),它將為已排序的數(shù)據(jù)或已反向排序的數(shù)據(jù)提供最佳大小寫堆棧空間開銷。


將堆棧空間開銷限制為O(log(n))的解決方法是在進行分區(qū)后,檢查哪個部分更小,并且只在較小的部分上使用遞歸,然后循環(huán)回去處理較大的部分(根據(jù)需要更新低或高以排除現(xiàn)在排序的較小部分,然后再循環(huán)回去)。


public static void quicksort(int[] arr, int low, int high)

{

    while (low < high) {

        int index = partition(arr, low, high);

        if((index-low) <= (high-index)){       // avoid stack overflow

            quicksort(arr, low, index - 1);    //

            low = index+1;                     //

        }else{                                 //

            quicksort(arr, index + 1, high);   //

            high = index-1;                    //

        }                                      //

    }

}


public static int partition(int[] arr, int low, int high)

{

    int pivot = arr[high];

    int i = low - 1;

    for (int j = low; j < high; j++) {

        if (arr[j] <= pivot) {

            i++;

            int tmp = arr[i];

            arr[i] = arr[j];

            arr[j] = tmp;

        }

    }

    int tmp = arr[i + 1];

    arr[i + 1] = arr[high];

    arr[high] = tmp;

    return (i + 1);

}

如果有興趣,Hoare分區(qū)方案更快:


public static void qsort(int[] a, int lo, int hi)

{

    while(lo < hi){

        int md = lo+(hi-lo)/2;

        int ll = lo-1;

        int hh = hi+1;

        int p = a[md];

        int t;

        while(true){

            while(a[++ll] < p);

            while(a[--hh] > p);

            if(ll >= hh)

                break;

            t     = a[ll];

            a[ll] = a[hh];

            a[hh] = t;

        }

        ll = hh++;

        if((ll - lo) <= (hi - hh)){

            qsort(a, lo, ll);

            lo = hh;

        } else {

            qsort(a, hh, hi);

            hi = ll;

        }

    }

}


查看完整回答
反對 回復(fù) 2022-09-07
  • 1 回答
  • 0 關(guān)注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號