相信我們在沒接觸過排序知識之前,一定會覺得快速排序非常具有魅力,不因別的單純快排這個名字就讓人不明覺厲,但是了解乙個演算法不應該只知道code,了解思想,應用非常重要。
我先問出我心中非常好奇的問題:
快排為啥叫快排,快排是所有排序裡面效能最好的嗎?快排適合什麼情況呢,還是無論什麼情況下快排總是最好的(顯然× ?快排演算法的思想是什麼?其效能優良的原因是依賴於演算法中的哪個部分?
首先回答前兩個問題:
快排的效能在所有排序演算法裡面是最好的,資料規模越大快速排序的效能越優。快排在極端情況下會退化成
假如在提前得知處理資料可能會出現極端情況的前提下,可以選擇使用較為穩定的歸併排序。
下面回答第三個問題:
一次快排過程
顯然,我們從圖中可以看出快排運用了二分的思想,首先選擇乙個基準,定義左右兩端指標,先從左到右進行掃瞄直到,r[hi] < temp,將r[hi]移動至lo所在位置
總結下來**, 自己懶得敲了:
void quicksort(r, int lo, int hi)
}
現在回答一下,為什麼快速排序是平均效能最好的排序演算法,其優渥之處體現在哪?因此,我們可以了解到,快速排序的優越性體現在他沒有多餘的比較上,對於初學者,我們可以較為簡單的認為,快排所需要的指令數會比較少。
演算法分析:
最差情況是,每次我們在劃分時,所取的基準總是陣列中最小的,因此我們總共會進行
最好的情況是,每次所取的基準就是該陣列的中點,因此一共需要進行n次劃分,對於 長度為
用遞迴算(下次補。。。):
隨機進行切割,最好算出複雜度還是
void quicksort(int r, int lo, int hi)
r[i] = temp;
quicksort(r, lo, i - 1);
quicksort(r, i + 1, hi);}}
DS排序 希爾排序
題目ds排序 希爾排序 題目描述 給出乙個資料序列,使用希爾排序演算法進行降序排序。間隔gap使用序列長度迴圈除2直到1 輸入第一行輸入t,表示有t個測試示例 第二行輸入n,表示第乙個示例有n個資料 n 1 第三行輸入n個資料,都是正整數,資料之間用空格隔開 以此類推 輸出對每組測試資料,輸出每趟排...
DS排序 快速排序
給出乙個資料序列,使用快速排序演算法進行從小到大的排序 第一行輸入 t,表示有 t個測試示例 第二行輸入 n,表示第乙個示例有 n個資料 第三行輸入 n個資料,都是正整數,資料之間用空格隔開 以此類推 每組測試資料,輸出每趟快排的結果,即每次排好乙個數字結果 長度為 1的子串行,不用排,不用輸出 不...
DS排序 快速排序
給出乙個資料序列,使用快速排序演算法進行從小到大的排序 第一行輸入t,表示有t個測試示例 第二行輸入n,表示第乙個示例有n個資料 第三行輸入n個資料,都是正整數,資料之間用空格隔開 以此類推 每組測試資料,輸出每趟快排的結果,即每次排好乙個數字結果 長度為1的子串行,不用排,不用輸出 不同測試資料間...